X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=src%2FgdcmOrientation.cxx;h=be0aa685aecd79771d2ed351de32d0a691abea9e;hb=80075429b6ab9db9e885b9bb9ae1427530c7bef8;hp=47fd0b2789a543e896485cd4b4771573053df808;hpb=ae64a0ce6b0e05103e13d8b2eedc87b7fcf02380;p=gdcm.git diff --git a/src/gdcmOrientation.cxx b/src/gdcmOrientation.cxx index 47fd0b27..be0aa685 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/09/30 17:45:01 $ - Version: $Revision: 1.14 $ + Date: $Date: 2008/08/18 12:27:10 $ + Version: $Revision: 1.27 $ 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 @@ -33,7 +33,7 @@ namespace gdcm /** * \brief THERALYS' Algorithm to determine the most similar basic orientation - * (Axial, Coronal, Sagital) of the image + * (Axial, Coronal, Sagittal) of the image * \note Should be run on the first gdcm::File of a 'coherent' Serie * @return orientation code * # 0 : Not Applicable (neither 0020,0037 Image Orientation Patient @@ -42,30 +42,55 @@ namespace gdcm * # -1 : Axial invert * # 2 : Coronal * # -2 : Coronal invert - * # 3 : Sagital - * # -3 : Sagital invert + * # 3 : Sagittal + * # -3 : Sagittal invert * # 4 : Heart Axial * # -4 : Heart Axial invert * # 5 : Heart Coronal * # -5 : Heart Coronal invert - * # 6 : Heart Sagital - * # -6 : Heart Sagital invert + * # 6 : Heart Sagittal + * # -6 : Heart Sagittal invert */ -double Orientation::TypeOrientation( File *f ) + +static const char *OrientationTypeStrings[] = { + "Not Applicable", + "Axial", + "Coronal", + "Sagittal", + "Heart Axial", + "Heart Coronal", + "Heart Sagittal", + "Axial invert", + "Coronal invert", + "Sagittal invert", + "Heart Axial invert", + "Heart Coronal invert", + "Heart Sagittal invert", + NULL +}; + +/// \brief returns human readable interpretation of the most +/// similar basic orientation (Axial, Coronal, Sagittal, ...) of the image +const char* Orientation::GetOrientationTypeString(OrientationType const o) +{ + int k = (int)o; + if (k < 0) + k = -k + 6; + + return OrientationTypeStrings[k]; +} + +/// \brief returns of the most similar basic orientation +/// (Axial, Coronal, Sagittal, ...) of the image +OrientationType Orientation::GetOrientationType( File *f ) { float iop[6]; bool succ = f->GetImageOrientationPatient( iop ); if ( !succ ) { - gdcmErrorMacro( "No Image Orientation (0020,0037) found in the file, cannot proceed." ) - return 0; + gdcmWarningMacro( "No Image Orientation (0020,0037)/(0020,0032) found in the file, cannot proceed." ) + return NotApplicable; } -/* -std::cout << " iop : "; -for(int i=0;i<6;i++) - std::cout << iop[i] << " "; -std::cout << std::endl; -*/ vector3D ori1; vector3D ori2; @@ -103,18 +128,11 @@ std::cout << std::endl; res=VerfCriterion( i, CalculLikelyhood2Vec(refA,refB,ori1,ori2), res ); res=VerfCriterion( -i, CalculLikelyhood2Vec(refB,refA,ori1,ori2), res ); } - return res.first; -/* -// 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] -*/ + // res thought looks like is a float value, but is indeed an int + // try casting it to int first then enum value to please VS7: + int int_res = (int)res.first; + gdcmAssertMacro( int_res <= 6 && int_res >= -6); + return (OrientationType)int_res; } Res @@ -131,16 +149,6 @@ Orientation::VerfCriterion(int typeCriterion, double criterionNew, Res const &in res.first = type; res.second = criterion; return res; -/* -// type = res[0] -// criterion = res[1] -// # if criterionNew<0.1 and criterionNew 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 @@ -406,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 ) { @@ -481,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 { @@ -523,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"; }