X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=src%2FgdcmOrientation.cxx;h=91cf0fe8b3d012c06ee08d4e4ec1f102563d0bdd;hb=224876ca6cbe71952f2a1d66d9853eca7745d3a0;hp=b6a33bb8e440caf0fe0bc5cf2e140bfa8b2f0cbd;hpb=e3c9bc76d580d3276c0e6cd61a168fa882775610;p=gdcm.git diff --git a/src/gdcmOrientation.cxx b/src/gdcmOrientation.cxx index b6a33bb8..91cf0fe8 100644 --- a/src/gdcmOrientation.cxx +++ b/src/gdcmOrientation.cxx @@ -3,8 +3,8 @@ 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 @@ -21,7 +21,7 @@ #include "gdcmDebug.h" #include // for sqrt -namespace gdcm +namespace GDCM_NAME_SPACE { //-------------------------------------------------------------------- // THERALYS Algorithm to determine the most similar basic orientation @@ -69,6 +69,8 @@ static const char *OrientationTypeStrings[] = { 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; @@ -78,13 +80,15 @@ const char* Orientation::GetOrientationTypeString(OrientationType const 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; @@ -204,146 +208,6 @@ Orientation::ProductVectorial(vector3D const &vec1, vector3D const &vec2) } - -// --------------------------------------------------------------------------- -// 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 : -------------------------------- -# - : - 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] ## [ , ] - 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 : - type : vector 3D (float) - # - : - type : vector 3D (float) - # - Description of the first plane - # - : - type : vector 3D (float) - # - : - 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 : -------------------------------- - # - : - type : vector 3D (float) - # - : - 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 @@ -410,21 +274,22 @@ have multiple letters in as described under "refinements" in C.7.6.1.1.1): */ /** - * \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 ) { @@ -485,7 +350,12 @@ Some more stuff, from XMedcon ---> 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 { @@ -527,7 +397,7 @@ GetPatSliceOrient(gdcm::File &h) 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"; }