Program: gdcm
Module: $RCSfile: gdcmOrientation.cxx,v $
Language: C++
- Date: $Date: 2005/10/03 14:54:16 $
- Version: $Revision: 1.16 $
+ Date: $Date: 2007/09/17 12:20:00 $
+ Version: $Revision: 1.26 $
Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
l'Image). All rights reserved. See Doc/License.txt or
#include "gdcmDebug.h"
#include <math.h> // for sqrt
-namespace gdcm
+namespace GDCM_NAME_SPACE
{
//--------------------------------------------------------------------
// THERALYS Algorithm to determine the most similar basic orientation
NULL
};
+/// \brief returns human readable interpretation of the most
+/// similar basic orientation (Axial, Coronal, Sagital, ...) of the image
const char* Orientation::GetOrientationTypeString(OrientationType const o)
{
int k = (int)o;
return OrientationTypeStrings[k];
}
+/// \brief returns of the most similar basic orientation
+/// (Axial, Coronal, Sagital, ...) of the image
OrientationType Orientation::GetOrientationType( File *f )
{
float iop[6];
bool succ = f->GetImageOrientationPatient( iop );
if ( !succ )
{
- gdcmErrorMacro( "No Image Orientation (0020,0037)/(0020,0032) found in the file, cannot proceed." )
+ gdcmWarningMacro( "No Image Orientation (0020,0037)/(0020,0032) found in the file, cannot proceed." )
return NotApplicable;
}
vector3D ori1;
}
-
-// ---------------------------------------------------------------------------
-// Here is the original Python code, kindly supplied by THERALYS
-//
-// C++ code doesn't give good results
-// --> FIXME
-
-/*
-
-def TypeOrientation(self,file0):
-"""
-# ------------------------- Purpose : -----------------------------------
-# - This function compare the orientation of the given image and the
-# basics orientations (Axial, Cornal, Sagital)
-# ------------------------- Parameters : --------------------------------
-# - <file0> : - type : string
-# - The name of the first image file of the serie
-# ------------------------- Return : ------------------------------------
-# 1 : Axial
-# -1 : Axial invert
-# 2 : Coronal
-# -2 : Coronal invert
-# 3 : Sagital
-# -3 : Sagital invert
-# 4 : Heart Axial
-# -4 : Heart Axial invert
-# 5 : Heart Coronal
-# -5 : Heart Coronal invert
-# 6 : Heart Sagital
-# -6 : Heart Sagital invert
-#
- # ------------------------- Other : -------------------------------------
-# This method finds the most similar basic orientation.
-"""
-try:
- toRead = gdcm.File(file0)
- ValDict = GetValuesDict(toRead)
- try:
- imageOrientation=ValDict["Image Orientation (Patient)"]
- except KeyError:
- imageOrientation=ValDict["Image Orientation"]
-
- ori1=[float(split(imageOrientation,"\\")[0]),\
- float(split(imageOrientation,"\\")[1]),\
- float(split(imageOrientation,"\\")[2])]
- ori2=[float(split(imageOrientation,"\\")[3]),\
- float(split(imageOrientation,"\\")[4]),\
- float(split(imageOrientation,"\\")[5])]
-
-## two vectors perpendicular describe one plane
- dicPlane=[ [ [1,0,0],[0,1,0] ], ## Axial
- [ [1,0,0],[0,0,-1] ], ## Coronal
- [ [0,1,0],[0,0,-1] ], ## Sagittal
- [ [ 0.8 , 0.5 , 0.0 ],[-0.1 , 0.1 , -0.95] ],## Axial - HEART
- [ [ 0.8 , 0.5 , 0.0 ],[-0.6674 , 0.687 , 0.1794] ],## Coronal - HEART
- [ [-0.1 , 0.1 , -0.95],[-0.6674 , 0.687 , 0.1794] ] ] ## Sagittal - HEART
-
- i=0
- res=[0,99999] ## [ <result> , <memory of the last succes calcule> ]
- for plane in dicPlane:
- i=i+1
- refA=plane[0]
- refB=plane[1]
- res=self.VerfCriterion( i , self.CalculLikelyhood2Vec(refA,refB,ori1,ori2) , res )
- res=self.VerfCriterion( -i , self.CalculLikelyhood2Vec(refB,refA,ori1,ori2) , res )
- return res[0]
-
- except KeyError:
- return 0
-
-
- def VerfCriterion(self,typeCriterion,criterionNew,res):
- type = res[0]
- criterion = res[1]
-# if criterionNew<0.1 and criterionNew<criterion:
- if criterionNew<criterion:
- criterion=criterionNew
- type=typeCriterion
- return [ type , criterion ]
-
-
- def CalculLikelyhood2Vec(self,refA,refB,ori1,ori2):
-"""
- # ------------------------- Purpose : -----------------------------------
- # - This function determine the orientation similarity of two planes.
- # Each plane is described by two vector.
- # ------------------------- Parameters : --------------------------------
- # - <refA> : - type : vector 3D (float)
- # - <refB> : - type : vector 3D (float)
- # - Description of the first plane
- # - <ori1> : - type : vector 3D (float)
- # - <ori2> : - type : vector 3D (float)
- # - Description of the second plane
- # ------------------------- Return : ------------------------------------
- # float : 0 if the planes are perpendicular.
- # While the difference of the orientation between the planes
- # are big more enlarge is
- # the criterion.
- # ------------------------- Other : -------------------------------------
- # The calculus is based with vectors normalice
- """
-
- ori3=self.ProductVectorial(ori1,ori2)
- refC=self.ProductVectorial(refA,refB)
- res=math.pow(refC[0]-ori3[0],2) + math.pow(refC[1]-ori3[1],2) + math.pow(refC[2]-ori3[2],2)
- return math.sqrt(res)
-
- def ProductVectorial(self,vec1,vec2):
- """
- # ------------------------- Purpose : -----------------------------------
- # - Calculus of the poduct vectorial between two vectors 3D
- # ------------------------- Parameters : --------------------------------
- # - <vec1> : - type : vector 3D (float)
- # - <vec2> : - type : vector 3D (float)
- # ------------------------- Return : ------------------------------------
- # (vec) : - Vector 3D
- # ------------------------- Other : -------------------------------------
- """
- vec3=[0,0,0]
- vec3[0]=vec1[1]*vec2[2] - vec1[2]*vec2[1]
- vec3[1]=-( vec1[0]*vec2[2] - vec1[2]*vec2[0])
- vec3[2]=vec1[0]*vec2[1] - vec1[1]*vec2[0]
- return vec3
-
- def GetValuesDict(image):
- """
- Returns a dictionnary containing values associated with Field Names
- dict["Dicom Field Name"]="Dicom field value"
- """
- val=image.GetFirstEntry()
- dic={}
- while(val):
- if isinstance(val,gdcm.ValEntryPtr):
- dic[val.GetName()]=val.GetValue()
- val=image.GetNextEntry()
- return dic
-
-*/
-
-
// ------------------------------------------------------------------------
/*
2.2.2 Orientation of DICOM images
*/
/**
- * \brief computes the Patient Orientation relative to the image plane
+ * \brief Computes the Patient Orientation relative to the image plane
* from the 'Image Orientation (Patient)'
- * The first entry is the direction of the rows, given by the
+ * - or from 0020 0035Image Orientation (RET) -
+ * - The first entry is the direction of the rows, given by the
* direction of the last pixel in the first row from the first
* pixel in that row.
- * The second entry is the direction of the columns, given by
+ * - The second entry is the direction of the columns, given by
* the direction of the last pixel in the first column from the
* first pixel in that column.
* Anatomical direction is designated by the capital
* letters: A (anterior), P (posterior), R (right),L (left),
* H (head), F (foot).
- * Refinements in the orientation descriptions are designated
+ * - Refinements in the orientation descriptions are designated
* by one or two additional letters in each value.
* Use it when "Patient Orientation" (0020,0020) is not found
- * @return orientation string as "rawOrientation\columnsOrientation"
+ * @return orientation string as "rowsOrientation\columnsOrientation"
*/
std::string Orientation::GetOrientation ( File *f )
{
---> Personal remark from JPRx :
--> patient_position (0x0018,0x5100) can be "HFS ", "FFS ", "HFP ", "FFP "
---> the cosines may ahave any value -1< <+1, for MR images !
+--> or, not so common,
+// HFDR = Head First-Decubitus Right
+// HFDL = Head First-Decubitus Left
+// FFDR = Feet First-Decubitus Right
+// FFDL = Feet First-Decubitus Left
+--> the cosines may have any value -1.< <+1., for MR images !
enum patient_slice_orientation_type
{
enum { transaxial, sagittal, coronal } slice_orientation;
std::string patient_position = h.GetEntryByNumber(0x0018,0x5100);
- if(patient_position == "gdcm::Unfound")
+ if(patient_position == GDCM_UNFOUND)
{
patient_position = "HF";
}