From: David Sarrut Date: Thu, 20 Oct 2011 05:26:14 +0000 (+0200) Subject: Merge branch 'master' of /home/dsarrut/clitk3.server X-Git-Tag: v1.3.0~174^2~43 X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=commitdiff_plain;h=aeb947ddd800ab06cf4916c9371bca3832056b4f;hp=5ef6fa9a2d0ed8ec37df89fb74f2a1860b7844f8;p=clitk.git Merge branch 'master' of /home/dsarrut/clitk3.server --- diff --git a/itk/clitkAddRelativePositionConstraintToLabelImageFilter.h b/itk/clitkAddRelativePositionConstraintToLabelImageFilter.h index fa5e95b..4d60a9d 100644 --- a/itk/clitkAddRelativePositionConstraintToLabelImageFilter.h +++ b/itk/clitkAddRelativePositionConstraintToLabelImageFilter.h @@ -21,6 +21,7 @@ // clitk #include "clitkFilterBase.h" +#include "clitkCropLikeImageFilter.h" // itk #include @@ -128,6 +129,12 @@ namespace clitk { itkSetMacro(CombineWithOrFlag, bool); itkBooleanMacro(CombineWithOrFlag); + itkGetConstMacro(FuzzyMapOnlyFlag, bool); + itkSetMacro(FuzzyMapOnlyFlag, bool); + itkBooleanMacro(FuzzyMapOnlyFlag); + + typename FloatImageType::Pointer GetFuzzyMap() { return m_FuzzyMap; } + // I dont want to verify inputs information virtual void VerifyInputInformation() { } @@ -151,6 +158,7 @@ namespace clitk { bool m_InverseOrientationFlag; bool m_RemoveObjectFlag; bool m_CombineWithOrFlag; + bool m_FuzzyMapOnlyFlag; virtual void GenerateOutputInformation(); virtual void GenerateInputRequestedRegion(); @@ -160,6 +168,7 @@ namespace clitk { typename ImageType::Pointer working_image; typename ImageType::Pointer object_resampled; typename FloatImageType::Pointer relPos; + typename FloatImageType::Pointer m_FuzzyMap; ImagePointer input; ImagePointer object; diff --git a/itk/clitkAddRelativePositionConstraintToLabelImageFilter.txx b/itk/clitkAddRelativePositionConstraintToLabelImageFilter.txx index 694910c..b73368f 100644 --- a/itk/clitkAddRelativePositionConstraintToLabelImageFilter.txx +++ b/itk/clitkAddRelativePositionConstraintToLabelImageFilter.txx @@ -22,6 +22,7 @@ #include "clitkAutoCropFilter.h" #include "clitkResampleImageWithOptionsFilter.h" #include "clitkBooleanOperatorLabelImageFilter.h" +#include "clitkCropLikeImageFilter.h" // itk #include @@ -61,6 +62,7 @@ AddRelativePositionConstraintToLabelImageFilter(): CombineWithOrFlagOff(); VerboseStepFlagOff(); WriteStepFlagOff(); + FuzzyMapOnlyFlagOff(); } //-------------------------------------------------------------------- @@ -361,7 +363,6 @@ GenerateData() typedef itk::RelativePositionPropImageFilter RelPosFilterType; typename RelPosFilterType::Pointer relPosFilter; - typename FloatImageType::Pointer m_FuzzyMap; for(int i=0; i + +namespace clitk { + + //-------------------------------------------------------------------- + template + void ComputeBBFromImageRegion(const ImageType * image, + typename ImageType::RegionType region, + typename itk::BoundingBox::Pointer bb); + + //-------------------------------------------------------------------- + template + void ComputeBBIntersection(typename itk::BoundingBox::Pointer bbo, + typename itk::BoundingBox::Pointer bbi1, + typename itk::BoundingBox::Pointer bbi2); + + //-------------------------------------------------------------------- + template + void ComputeRegionFromBB(const ImageType * image, + const typename itk::BoundingBox::Pointer bb, + typename ImageType::RegionType & region); +} // end clitk namespace + +#include "clitkBoundingBoxUtils.txx" + +#endif diff --git a/itk/clitkBoundingBoxUtils.txx b/itk/clitkBoundingBoxUtils.txx new file mode 100644 index 0000000..26f38b2 --- /dev/null +++ b/itk/clitkBoundingBoxUtils.txx @@ -0,0 +1,106 @@ +/*========================================================================= + Program: vv http://www.creatis.insa-lyon.fr/rio/vv + + Authors belong to: + - University of LYON http://www.universite-lyon.fr/ + - Léon Bérard cancer center http://www.centreleonberard.fr + - CREATIS CNRS laboratory http://www.creatis.insa-lyon.fr + + This software is distributed WITHOUT ANY WARRANTY; without even + the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + PURPOSE. See the copyright notices for more information. + + It is distributed under dual licence + + - BSD See included LICENSE.txt file + - CeCILL-B http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html + ======================================================================-====*/ + +namespace clitk { + + //-------------------------------------------------------------------- + template + void ComputeBBFromImageRegion(const ImageType * image, + typename ImageType::RegionType region, + typename itk::BoundingBox::Pointer bb) { + typedef typename ImageType::IndexType IndexType; + IndexType firstIndex; + IndexType lastIndex; + for(unsigned int i=0; iGetImageDimension(); i++) { + firstIndex[i] = region.GetIndex()[i]; + lastIndex[i] = firstIndex[i]+region.GetSize()[i]; + } + + typedef itk::BoundingBox BBType; + typedef typename BBType::PointType PointType; + PointType lastPoint; + PointType firstPoint; + image->TransformIndexToPhysicalPoint(firstIndex, firstPoint); + image->TransformIndexToPhysicalPoint(lastIndex, lastPoint); + + bb->SetMaximum(lastPoint); + bb->SetMinimum(firstPoint); + } + //-------------------------------------------------------------------- + + + //-------------------------------------------------------------------- + template + void ComputeBBIntersection(typename itk::BoundingBox::Pointer bbo, + typename itk::BoundingBox::Pointer bbi1, + typename itk::BoundingBox::Pointer bbi2) { + + typedef itk::BoundingBox BBType; + typedef typename BBType::PointType PointType; + PointType lastPoint; + PointType firstPoint; + + for(unsigned int i=0; iGetMinimum()[i], + bbi2->GetMinimum()[i]); + lastPoint[i] = std::min(bbi1->GetMaximum()[i], + bbi2->GetMaximum()[i]); + } + + bbo->SetMaximum(lastPoint); + bbo->SetMinimum(firstPoint); + } + //-------------------------------------------------------------------- + + + //-------------------------------------------------------------------- + template + void ComputeRegionFromBB(const ImageType * image, + const typename itk::BoundingBox::Pointer bb, + typename ImageType::RegionType & region) { + // Types + typedef typename ImageType::IndexType IndexType; + typedef typename ImageType::PointType PointType; + typedef typename ImageType::RegionType RegionType; + typedef typename ImageType::SizeType SizeType; + + // Region starting point + IndexType regionStart; + PointType start = bb->GetMinimum(); + image->TransformPhysicalPointToIndex(start, regionStart); + + // Region size + SizeType regionSize; + PointType maxs = bb->GetMaximum(); + PointType mins = bb->GetMinimum(); + for(unsigned int i=0; iGetSpacing()[i]); + } + + // Create region + region.SetIndex(regionStart); + region.SetSize(regionSize); + } + //-------------------------------------------------------------------- + + +} // end of namespace + diff --git a/itk/clitkCropLikeImageFilter.h b/itk/clitkCropLikeImageFilter.h index 9281fca..9c12d78 100644 --- a/itk/clitkCropLikeImageFilter.h +++ b/itk/clitkCropLikeImageFilter.h @@ -100,6 +100,15 @@ namespace clitk { }; // end class //-------------------------------------------------------------------- + + //-------------------------------------------------------------------- + // Convenient function + template + typename ImageType::Pointer + ResizeImageLike(const ImageType * input, + const itk::ImageBase * like, + typename ImageType::PixelType BG); + } // end namespace clitk //-------------------------------------------------------------------- diff --git a/itk/clitkCropLikeImageFilter.txx b/itk/clitkCropLikeImageFilter.txx index 73dd7a7..5a9696e 100644 --- a/itk/clitkCropLikeImageFilter.txx +++ b/itk/clitkCropLikeImageFilter.txx @@ -23,9 +23,6 @@ #include "clitkCommon.h" #include "clitkPasteImageFilter.h" -// itk -//#include "itkPasteImageFilter.h" - //-------------------------------------------------------------------- template clitk::CropLikeImageFilter:: @@ -244,5 +241,23 @@ GenerateData() { } //-------------------------------------------------------------------- + +//-------------------------------------------------------------------- +template +typename ImageType::Pointer +clitk::ResizeImageLike(const ImageType * input, + const itk::ImageBase * like, + typename ImageType::PixelType backgroundValue) +{ + typedef clitk::CropLikeImageFilter CropFilterType; + typename CropFilterType::Pointer cropFilter = CropFilterType::New(); + cropFilter->SetInput(input); + cropFilter->SetCropLikeImage(like); + cropFilter->SetBackgroundValue(backgroundValue); + cropFilter->Update(); + return cropFilter->GetOutput(); +} +//-------------------------------------------------------------------- + -#endif //#define CLITKAUTOCROPFILTER +#endif //#define CLITKCROPLIKEIMAGEFILTER_TXX diff --git a/itk/clitkRelativePositionAnalyzerFilter.h b/itk/clitkRelativePositionAnalyzerFilter.h new file mode 100644 index 0000000..2933958 --- /dev/null +++ b/itk/clitkRelativePositionAnalyzerFilter.h @@ -0,0 +1,114 @@ +/*========================================================================= + Program: vv http://www.creatis.insa-lyon.fr/rio/vv + + Authors belong to: + - University of LYON http://www.universite-lyon.fr/ + - Léon Bérard cancer center http://www.centreleonberard.fr + - CREATIS CNRS laboratory http://www.creatis.insa-lyon.fr + + This software is distributed WITHOUT ANY WARRANTY; without even + the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + PURPOSE. See the copyright notices for more information. + + It is distributed under dual licence + + - BSD See included LICENSE.txt file + - CeCILL-B http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html + ===========================================================================**/ + +#ifndef CLITKRELATIVEPOSITIONANALYZERFILTER_H +#define CLITKRELATIVEPOSITIONANALYZERFILTER_H + +// clitk +#include "clitkCommon.h" + +// itk +#include + +namespace clitk { + + //-------------------------------------------------------------------- + /* + TODO + */ + //-------------------------------------------------------------------- + + template + class ITK_EXPORT RelativePositionAnalyzerFilter: + public itk::ImageToImageFilter + { + + public: + /** Standard class typedefs. */ + typedef itk::ImageToImageFilter Superclass; + typedef RelativePositionAnalyzerFilter Self; + typedef itk::SmartPointer Pointer; + typedef itk::SmartPointer ConstPointer; + + /** Method for creation through the object factory. */ + itkNewMacro(Self); + + /** Run-time type information (and related methods). */ + itkTypeMacro(RelativePositionAnalyzerFilter, ImageToImageFilter); + + /** Some convenient typedefs. */ + typedef typename ImageType::ConstPointer ImageConstPointer; + typedef typename ImageType::Pointer ImagePointer; + typedef typename ImageType::RegionType RegionType; + typedef typename ImageType::PixelType PixelType; + typedef typename ImageType::SpacingType SpacingType; + typedef typename ImageType::SizeType SizeType; + typedef typename ImageType::IndexType IndexType; + typedef typename ImageType::PointType PointType; + + /** ImageDimension constants */ + itkStaticConstMacro(ImageDimension, unsigned int, ImageType::ImageDimension); + typedef itk::Image FloatImageType; + + /** Input : initial image and object */ + void SetInputSupport(const ImageType * image); + void SetInputObject(const ImageType * image); + void SetInputTarget(const ImageType * image); + + // Options + itkSetMacro(VerboseFlag, bool); + itkGetConstMacro(VerboseFlag, bool); + itkBooleanMacro(VerboseFlag); + + itkGetConstMacro(BackgroundValue, PixelType); + itkSetMacro(BackgroundValue, PixelType); + + itkGetConstMacro(ForegroundValue, PixelType); + itkSetMacro(ForegroundValue, PixelType); + + // For debug + void PrintOptions(); + + protected: + RelativePositionAnalyzerFilter(); + virtual ~RelativePositionAnalyzerFilter() {} + + bool m_VerboseFlag; + PixelType m_BackgroundValue; + PixelType m_ForegroundValue; + ImagePointer m_Support; + ImagePointer m_Object; + ImagePointer m_Target; + + virtual void GenerateData(); + + private: + RelativePositionAnalyzerFilter(const Self&); //purposely not implemented + void operator=(const Self&); //purposely not implemented + + }; // end class + //-------------------------------------------------------------------- + +} // end namespace clitk +//-------------------------------------------------------------------- + +#ifndef ITK_MANUAL_INSTANTIATION +#include "clitkRelativePositionAnalyzerFilter.txx" +#endif + +#endif diff --git a/itk/clitkRelativePositionAnalyzerFilter.txx b/itk/clitkRelativePositionAnalyzerFilter.txx new file mode 100644 index 0000000..a732aab --- /dev/null +++ b/itk/clitkRelativePositionAnalyzerFilter.txx @@ -0,0 +1,135 @@ +/*========================================================================= + Program: vv http://www.creatis.insa-lyon.fr/rio/vv + + Authors belong to: + - University of LYON http://www.universite-lyon.fr/ + - Léon Bérard cancer center http://www.centreleonberard.fr + - CREATIS CNRS laboratory http://www.creatis.insa-lyon.fr + + This software is distributed WITHOUT ANY WARRANTY; without even + the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + PURPOSE. See the copyright notices for more information. + + It is distributed under dual licence + + - BSD See included LICENSE.txt file + - CeCILL-B http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html + ===========================================================================**/ + +//-------------------------------------------------------------------- +template +clitk::RelativePositionAnalyzerFilter:: +RelativePositionAnalyzerFilter(): +itk::ImageToImageFilter() +{ + this->SetNumberOfRequiredInputs(3); // support, object, target + VerboseFlagOff(); +} +//-------------------------------------------------------------------- + + +//-------------------------------------------------------------------- +template +void +clitk::RelativePositionAnalyzerFilter:: +SetInputSupport(const ImageType * image) +{ + // Process object is not const-correct so the const casting is required. + this->SetNthInput(0, const_cast(image)); +} +//-------------------------------------------------------------------- + + +//-------------------------------------------------------------------- +template +void +clitk::RelativePositionAnalyzerFilter:: +SetInputObject(const ImageType * image) +{ + // Process object is not const-correct so the const casting is required. + this->SetNthInput(1, const_cast(image)); +} +//-------------------------------------------------------------------- + + +//-------------------------------------------------------------------- +template +void +clitk::RelativePositionAnalyzerFilter:: +SetInputTarget(const ImageType * image) +{ + // Process object is not const-correct so the const casting is required. + this->SetNthInput(1, const_cast(image)); +} +//-------------------------------------------------------------------- + + +//-------------------------------------------------------------------- +template +void +clitk::RelativePositionAnalyzerFilter:: +PrintOptions() +{ + DD("TODO"); +} +//-------------------------------------------------------------------- + + +//-------------------------------------------------------------------- +template +void +clitk::RelativePositionAnalyzerFilter:: +GenerateData() +{ + DD("Update"); + // Get input pointer + m_Support = dynamic_cast(itk::ProcessObject::GetInput(0)); + m_Object = dynamic_cast(itk::ProcessObject::GetInput(1)); + m_Target = dynamic_cast(itk::ProcessObject::GetInput(2)); + static const unsigned int dim = ImageType::ImageDimension; + + /* + Prerequisite: + - target fully inside support ? + */ + + //for(int i=0; i analyze floating point values inside the target area (histo ?) + + // Set threshold and compute new support + + // Compute ratio of area before/after + // http://www.itk.org/Doxygen/html/classitk_1_1LabelStatisticsImageFilter.html#details + /* + typedef itk::LabelStatisticsImageFilter StatisticsImageFilterType; + typename StatisticsImageFilterType::Pointer statisticsFilter = StatisticsImageFilterType::New(); + statisticsFilter->SetInput(m_Input); + statisticsFilter->SetLabelInput(m_Input); + statisticsFilter->Update(); + int n = labelStatisticsImageFilter->GetCount(GetForegroundValue()); + DD(n); + statisticsFilter = StatisticsImageFilterType::New(); + statisticsFilter->SetInput(m_Output); + statisticsFilter->SetLabelInput(m_Output); + statisticsFilter->Update(); + int m = labelStatisticsImageFilter->GetCount(GetForegroundValue()); + DD(m); + */ + + // Print results + + //} + + + // Final Step -> set output TODO + // this->SetNthOutput(0, working_image); + // this->GraftOutput(working_image); +} +//-------------------------------------------------------------------- + diff --git a/itk/clitkSegmentationUtils.h b/itk/clitkSegmentationUtils.h index 70388fe..cd1612a 100644 --- a/itk/clitkSegmentationUtils.h +++ b/itk/clitkSegmentationUtils.h @@ -38,25 +38,6 @@ namespace clitk { //-------------------------------------------------------------------- - template - void ComputeBBFromImageRegion(const ImageType * image, - typename ImageType::RegionType region, - typename itk::BoundingBox::Pointer bb); - - //-------------------------------------------------------------------- - template - void ComputeBBIntersection(typename itk::BoundingBox::Pointer bbo, - typename itk::BoundingBox::Pointer bbi1, - typename itk::BoundingBox::Pointer bbi2); - - //-------------------------------------------------------------------- - template - void ComputeRegionFromBB(const ImageType * image, - const typename itk::BoundingBox::Pointer bb, - typename ImageType::RegionType & region); - //-------------------------------------------------------------------- template typename TInternalImageType::Pointer SetBackground(const TInternalImageType * input, @@ -136,13 +117,6 @@ namespace clitk { int minimalComponentSize, LabelizeParameters * param); - //-------------------------------------------------------------------- - template - typename ImageType::Pointer - ResizeImageLike(const ImageType * input, - const itk::ImageBase * like, - typename ImageType::PixelType BG); - //-------------------------------------------------------------------- template diff --git a/itk/clitkSegmentationUtils.txx b/itk/clitkSegmentationUtils.txx index 2f0d935..3022ad2 100644 --- a/itk/clitkSegmentationUtils.txx +++ b/itk/clitkSegmentationUtils.txx @@ -38,89 +38,6 @@ namespace clitk { - //-------------------------------------------------------------------- - template - void ComputeBBFromImageRegion(const ImageType * image, - typename ImageType::RegionType region, - typename itk::BoundingBox::Pointer bb) { - typedef typename ImageType::IndexType IndexType; - IndexType firstIndex; - IndexType lastIndex; - for(unsigned int i=0; iGetImageDimension(); i++) { - firstIndex[i] = region.GetIndex()[i]; - lastIndex[i] = firstIndex[i]+region.GetSize()[i]; - } - - typedef itk::BoundingBox BBType; - typedef typename BBType::PointType PointType; - PointType lastPoint; - PointType firstPoint; - image->TransformIndexToPhysicalPoint(firstIndex, firstPoint); - image->TransformIndexToPhysicalPoint(lastIndex, lastPoint); - - bb->SetMaximum(lastPoint); - bb->SetMinimum(firstPoint); - } - //-------------------------------------------------------------------- - - - //-------------------------------------------------------------------- - template - void ComputeBBIntersection(typename itk::BoundingBox::Pointer bbo, - typename itk::BoundingBox::Pointer bbi1, - typename itk::BoundingBox::Pointer bbi2) { - - typedef itk::BoundingBox BBType; - typedef typename BBType::PointType PointType; - PointType lastPoint; - PointType firstPoint; - - for(unsigned int i=0; iGetMinimum()[i], - bbi2->GetMinimum()[i]); - lastPoint[i] = std::min(bbi1->GetMaximum()[i], - bbi2->GetMaximum()[i]); - } - - bbo->SetMaximum(lastPoint); - bbo->SetMinimum(firstPoint); - } - //-------------------------------------------------------------------- - - - //-------------------------------------------------------------------- - template - void ComputeRegionFromBB(const ImageType * image, - const typename itk::BoundingBox::Pointer bb, - typename ImageType::RegionType & region) { - // Types - typedef typename ImageType::IndexType IndexType; - typedef typename ImageType::PointType PointType; - typedef typename ImageType::RegionType RegionType; - typedef typename ImageType::SizeType SizeType; - - // Region starting point - IndexType regionStart; - PointType start = bb->GetMinimum(); - image->TransformPhysicalPointToIndex(start, regionStart); - - // Region size - SizeType regionSize; - PointType maxs = bb->GetMaximum(); - PointType mins = bb->GetMinimum(); - for(unsigned int i=0; iGetSpacing()[i]); - } - - // Create region - region.SetIndex(regionStart); - region.SetSize(regionSize); - } - //-------------------------------------------------------------------- - //-------------------------------------------------------------------- template typename ImageType::Pointer @@ -312,24 +229,6 @@ namespace clitk { //-------------------------------------------------------------------- - //-------------------------------------------------------------------- - template - typename ImageType::Pointer - ResizeImageLike(const ImageType * input, - const itk::ImageBase * like, - typename ImageType::PixelType backgroundValue) - { - typedef CropLikeImageFilter CropFilterType; - typename CropFilterType::Pointer cropFilter = CropFilterType::New(); - cropFilter->SetInput(input); - cropFilter->SetCropLikeImage(like); - cropFilter->SetBackgroundValue(backgroundValue); - cropFilter->Update(); - return cropFilter->GetOutput(); - } - //-------------------------------------------------------------------- - - //-------------------------------------------------------------------- template typename MaskImageType::Pointer @@ -343,7 +242,7 @@ namespace clitk { bool autocropFlag, bool singleObjectCCL) { - typedef SliceBySliceRelativePositionFilter SliceRelPosFilterType; + typedef clitk::SliceBySliceRelativePositionFilter SliceRelPosFilterType; typename SliceRelPosFilterType::Pointer sliceRelPosFilter = SliceRelPosFilterType::New(); sliceRelPosFilter->VerboseStepFlagOff(); sliceRelPosFilter->WriteStepFlagOff(); diff --git a/segmentation/clitkExtractLymphStation_3A.txx b/segmentation/clitkExtractLymphStation_3A.txx index e973ed0..50e3948 100644 --- a/segmentation/clitkExtractLymphStation_3A.txx +++ b/segmentation/clitkExtractLymphStation_3A.txx @@ -148,19 +148,10 @@ ExtractStation_3A_Post_Limits_With_Dilated_Aorta_S6_Support() Aorta = clitk::Dilate(Aorta, radius, GetBackgroundValue(), GetForegroundValue(), false); // Now, insert this image in the AFDB (but do not store on disk) - GetAFDB()->template SetImage("Aorta_Dilated_Anteriorly", "bidon", - Aorta, false); - /* - // Not Post to - m_Working_Support = - clitk::SliceBySliceRelativePosition(m_Working_Support, Aorta, 2, - GetFuzzyThreshold("3A", "Aorta"), - "NotPostTo", true, - Aorta->GetSpacing()[0], false, false); - - */ + GetAFDB()->template SetImage("Aorta_Dilated_Anteriorly", "seg/Aorta_Dilated_Anteriorly.mha", Aorta, false); + writeImage(Aorta, "seg/Aorta_Dilated_Anteriorly.mha"); + GetAFDB()->Write(); - StopCurrentStep(m_Working_Support); m_ListOfStations["3A"] = m_Working_Support; } diff --git a/segmentation/clitkExtractLymphStation_Supports.txx b/segmentation/clitkExtractLymphStation_Supports.txx index 2cde97d..79abe6a 100644 --- a/segmentation/clitkExtractLymphStation_Supports.txx +++ b/segmentation/clitkExtractLymphStation_Supports.txx @@ -123,6 +123,8 @@ Support_SupInf_S1RL() MaskImagePointType p; p[0] = p[1] = p[2] = 0.0; // to avoid warning clitk::FindExtremaPointInAGivenDirection(Sternum, GetBackgroundValue(), 2, false, p); + // DD(p); + p[2] += Sternum->GetSpacing()[2]; // add one slice: start just superiorly MaskImagePointer S1RL = clitk::CropImageRemoveLowerThan(m_Working_Support, 2, p[2], true, GetBackgroundValue()); diff --git a/segmentation/clitkExtractLymphStationsFilter.old.h b/segmentation/clitkExtractLymphStationsFilter.old.h deleted file mode 100644 index 6be4764..0000000 --- a/segmentation/clitkExtractLymphStationsFilter.old.h +++ /dev/null @@ -1,124 +0,0 @@ -/*========================================================================= - Program: vv http://www.creatis.insa-lyon.fr/rio/vv - - Authors belong to: - - University of LYON http://www.universite-lyon.fr/ - - Léon Bérard cancer center http://oncora1.lyon.fnclcc.fr - - CREATIS CNRS laboratory http://www.creatis.insa-lyon.fr - - This software is distributed WITHOUT ANY WARRANTY; without even - the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR - PURPOSE. See the copyright notices for more information. - - It is distributed under dual licence - - - BSD See included LICENSE.txt file - - CeCILL-B http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html - ======================================================================-====*/ - -#ifndef CLITKEXTRACTLYMPHSTATIONSFILTER_H -#define CLITKEXTRACTLYMPHSTATIONSFILTER_H - -// clitk -#include "clitkFilterBase.h" -#include "clitkFilterWithAnatomicalFeatureDatabaseManagement.h" - -namespace clitk { - - //-------------------------------------------------------------------- - /* - Try to extract the LymphStations part of a thorax CT. - Inputs : - - Patient label image - - Lungs label image - - Bones label image - */ - //-------------------------------------------------------------------- - - template - class ITK_EXPORT ExtractLymphStationsFilter: - public virtual clitk::FilterBase, - public clitk::FilterWithAnatomicalFeatureDatabaseManagement, - public itk::ImageToImageFilter > - { - - public: - /** Standard class typedefs. */ - typedef itk::ImageToImageFilter > Superclass; - typedef ExtractLymphStationsFilter Self; - typedef itk::SmartPointer Pointer; - typedef itk::SmartPointer ConstPointer; - - /** Method for creation through the object factory. */ - itkNewMacro(Self); - - /** Run-time type information (and related methods). */ - itkTypeMacro(ExtractLymphStationsFilter, InPlaceImageFilter); - - /** Some convenient typedefs. */ - typedef TImageType ImageType; - typedef typename ImageType::ConstPointer ImageConstPointer; - typedef typename ImageType::Pointer ImagePointer; - typedef typename ImageType::RegionType ImageRegionType; - typedef typename ImageType::PixelType ImagePixelType; - typedef typename ImageType::SizeType ImageSizeType; - typedef typename ImageType::IndexType ImageIndexType; - typedef typename ImageType::PointType ImagePointType; - - typedef uchar MaskImagePixelType; - typedef itk::Image MaskImageType; - typedef typename MaskImageType::Pointer MaskImagePointer; - - /** Connect inputs */ - // void SetInput(const TImageType * image); - - /** ImageDimension constants */ - itkStaticConstMacro(ImageDimension, unsigned int, TImageType::ImageDimension); - FILTERBASE_INIT; - - itkGetConstMacro(BackgroundValue, ImagePixelType); - itkGetConstMacro(ForegroundValue, ImagePixelType); - itkSetMacro(BackgroundValue, ImagePixelType); - itkSetMacro(ForegroundValue, ImagePixelType); - - itkSetMacro(FuzzyThreshold, double); - itkGetConstMacro(FuzzyThreshold, double); - - protected: - ExtractLymphStationsFilter(); - virtual ~ExtractLymphStationsFilter() {} - - virtual void GenerateOutputInformation(); - virtual void GenerateInputRequestedRegion(); - virtual void GenerateData(); - - MaskImagePointer m_mediastinum; - MaskImagePointer m_trachea; - MaskImagePointer m_working_mediastinum; - MaskImagePointer m_working_trachea; - MaskImagePointer m_output; - - ImagePixelType m_BackgroundValue; - ImagePixelType m_ForegroundValue; - double m_CarinaZPositionInMM; - bool m_CarinaZPositionInMMIsSet; - double m_MiddleLobeBronchusZPositionInMM; - - double m_IntermediateSpacing; - double m_FuzzyThreshold; - - private: - ExtractLymphStationsFilter(const Self&); //purposely not implemented - void operator=(const Self&); //purposely not implemented - - }; // end class - //-------------------------------------------------------------------- - -} // end namespace clitk -//-------------------------------------------------------------------- - -#ifndef ITK_MANUAL_INSTANTIATION -#include "clitkExtractLymphStationsFilter.txx" -#endif - -#endif diff --git a/segmentation/clitkExtractLymphStationsFilter.old.txx b/segmentation/clitkExtractLymphStationsFilter.old.txx deleted file mode 100644 index c95be39..0000000 --- a/segmentation/clitkExtractLymphStationsFilter.old.txx +++ /dev/null @@ -1,395 +0,0 @@ -/*========================================================================= - Program: vv http://www.creatis.insa-lyon.fr/rio/vv - - Authors belong to: - - University of LYON http://www.universite-lyon.fr/ - - Léon Bérard cancer center http://oncora1.lyon.fnclcc.fr - - CREATIS CNRS laboratory http://www.creatis.insa-lyon.fr - - This software is distributed WITHOUT ANY WARRANTY; without even - the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR - PURPOSE. See the copyright notices for more information. - - It is distributed under dual licence - - - BSD See included LICENSE.txt file - - CeCILL-B http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html - ======================================================================-====*/ - -#ifndef CLITKEXTRACTLYMPHSTATIONSFILTER_TXX -#define CLITKEXTRACTLYMPHSTATIONSFILTER_TXX - -// clitk -#include "clitkCommon.h" -#include "clitkExtractLymphStationsFilter.h" -#include "clitkAddRelativePositionConstraintToLabelImageFilter.h" -#include "clitkSegmentationUtils.h" -#include "clitkAutoCropFilter.h" -#include "clitkSegmentationUtils.h" -#include "clitkSliceBySliceRelativePositionFilter.h" - -// itk -#include -#include -#include -#include -#include -#include -#include - -// itk ENST -#include "RelativePositionPropImageFilter.h" - -//-------------------------------------------------------------------- -template -clitk::ExtractLymphStationsFilter:: -ExtractLymphStationsFilter(): - clitk::FilterBase(), - clitk::FilterWithAnatomicalFeatureDatabaseManagement(), - itk::ImageToImageFilter() -{ - this->SetNumberOfRequiredInputs(1); - SetBackgroundValue(0); - SetForegroundValue(1); - SetFuzzyThreshold(0.5); -} -//-------------------------------------------------------------------- - - -//-------------------------------------------------------------------- -template -void -clitk::ExtractLymphStationsFilter:: -GenerateOutputInformation() { - // Superclass::GenerateOutputInformation(); - - // Get input - LoadAFDB(); - m_mediastinum = GetAFDB()->template GetImage ("mediastinum"); - m_trachea = GetAFDB()->template GetImage ("trachea"); - ImagePointType carina; - GetAFDB()->GetPoint3D("carina", carina); - m_CarinaZPositionInMM = carina[2]; - DD(m_CarinaZPositionInMM); - ImagePointType mlb; - GetAFDB()->GetPoint3D("middleLobeBronchus", mlb); - m_MiddleLobeBronchusZPositionInMM = mlb[2]; - DD(m_MiddleLobeBronchusZPositionInMM); - - // ---------------------------------------------------------------- - // ---------------------------------------------------------------- - // Superior limit = carina - // Inferior limit = origin right middle lobe bronchus - StartNewStep("Inf/Sup mediastinum limits with carina/bronchus"); - m_working_mediastinum = - clitk::CropImageAlongOneAxis(m_mediastinum, 2, - m_MiddleLobeBronchusZPositionInMM, - m_CarinaZPositionInMM, true, - GetBackgroundValue()); - StopCurrentStep(m_working_mediastinum); - m_output = m_working_mediastinum; - - // ---------------------------------------------------------------- - // ---------------------------------------------------------------- - // Superior limit = carina - // Inferior limit = origin right middle lobe bronchus - StartNewStep("Inf/Sup trachea limits with carina/bronchus"); - m_working_trachea = - clitk::CropImageAlongOneAxis(m_trachea, 2, - m_MiddleLobeBronchusZPositionInMM, - m_CarinaZPositionInMM, true, - GetBackgroundValue()); - StopCurrentStep(m_working_trachea); - - // ---------------------------------------------------------------- - // ---------------------------------------------------------------- - // Separate trachea in two CCL - StartNewStep("Separate trachea under carina"); - - // Labelize and consider two main labels - m_working_trachea = Labelize(m_working_trachea, 0, true, 1); - - // Carina position must at the first slice that separate the two main bronchus (not superiorly) - // Check that upper slice is composed of at least two labels - typedef itk::ImageSliceIteratorWithIndex SliceIteratorType; - SliceIteratorType iter(m_working_trachea, m_working_trachea->GetLargestPossibleRegion()); - iter.SetFirstDirection(0); - iter.SetSecondDirection(1); - iter.GoToReverseBegin(); // Start from the end (because image is IS not SI) - int maxLabel=0; - while (!iter.IsAtReverseEndOfSlice()) { - while (!iter.IsAtReverseEndOfLine()) { - // DD(iter.GetIndex()); - if (iter.Get() > maxLabel) maxLabel = iter.Get(); - --iter; - } - iter.PreviousLine(); - } - if (maxLabel < 2) { - clitkExceptionMacro("First slice form Carina does not seems to seperate the two main bronchus. Abort"); - } - - // Compute centroid of both parts to identify the left from the right bronchus - typedef long LabelType; - static const unsigned int Dim = ImageType::ImageDimension; - typedef itk::ShapeLabelObject< LabelType, Dim > LabelObjectType; - typedef itk::LabelMap< LabelObjectType > LabelMapType; - typedef itk::LabelImageToLabelMapFilter ImageToMapFilterType; - typename ImageToMapFilterType::Pointer imageToLabelFilter = ImageToMapFilterType::New(); - typedef itk::ShapeLabelMapFilter ShapeFilterType; - typename ShapeFilterType::Pointer statFilter = ShapeFilterType::New(); - imageToLabelFilter->SetBackgroundValue(GetBackgroundValue()); - imageToLabelFilter->SetInput(m_working_trachea); - statFilter->SetInput(imageToLabelFilter->GetOutput()); - statFilter->Update(); - typename LabelMapType::Pointer labelMap = statFilter->GetOutput(); - - ImagePointType C1 = labelMap->GetLabelObject(1)->GetCentroid(); - ImagePointType C2 = labelMap->GetLabelObject(2)->GetCentroid(); - - ImagePixelType leftLabel; - ImagePixelType rightLabel; - if (C1[0] < C2[0]) { leftLabel = 1; rightLabel = 2; } - else { leftLabel = 2; rightLabel = 1; } - DD(leftLabel); - DD(rightLabel); - - StopCurrentStep(m_working_trachea); - - //----------------------------------------------------- - StartNewStep("Left limits with bronchus (slice by slice)"); - // Select LeftLabel (set one label to Backgroundvalue) - MaskImagePointer leftBronchus = - SetBackground(m_working_trachea, m_working_trachea, - rightLabel, GetBackgroundValue()); - MaskImagePointer rightBronchus = - SetBackground(m_working_trachea, m_working_trachea, - leftLabel, GetBackgroundValue()); - writeImage(leftBronchus, "left.mhd"); - writeImage(rightBronchus, "right.mhd"); - - m_working_mediastinum = - clitk::SliceBySliceRelativePosition(m_working_mediastinum, - leftBronchus, 2, - GetFuzzyThreshold(), "RightTo", - true, 4); - m_working_mediastinum = - clitk::SliceBySliceRelativePosition(m_working_mediastinum, - rightBronchus, - 2, GetFuzzyThreshold(), "LeftTo", - true, 4); - m_working_mediastinum = - clitk::SliceBySliceRelativePosition(m_working_mediastinum, - leftBronchus, - 2, GetFuzzyThreshold(), "AntTo", - true, 4, true); // NOT - m_working_mediastinum = - clitk::SliceBySliceRelativePosition(m_working_mediastinum, - rightBronchus, - 2, GetFuzzyThreshold(), "AntTo", - true, 4, true); - m_working_mediastinum = - clitk::SliceBySliceRelativePosition(m_working_mediastinum, - leftBronchus, - 2, GetFuzzyThreshold(), "PostTo", - true, 4, true); - m_working_mediastinum = - clitk::SliceBySliceRelativePosition(m_working_mediastinum, - rightBronchus, - 2, GetFuzzyThreshold(), "PostTo", - true, 4, true); - m_output = m_working_mediastinum; - StopCurrentStep(m_output); - - //----------------------------------------------------- - //----------------------------------------------------- - StartNewStep("Posterior limits"); - - // Left Bronchus slices - typedef clitk::ExtractSliceFilter ExtractSliceFilterType; - typedef typename ExtractSliceFilterType::SliceType SliceType; - typename ExtractSliceFilterType::Pointer - extractSliceFilter = ExtractSliceFilterType::New(); - extractSliceFilter->SetInput(leftBronchus); - extractSliceFilter->SetDirection(2); - extractSliceFilter->Update(); - std::vector leftBronchusSlices; - extractSliceFilter->GetOutputSlices(leftBronchusSlices); - - // Right Bronchus slices - extractSliceFilter = ExtractSliceFilterType::New(); - extractSliceFilter->SetInput(rightBronchus); - extractSliceFilter->SetDirection(2); - extractSliceFilter->Update(); - std::vector rightBronchusSlices ; - extractSliceFilter->GetOutputSlices(rightBronchusSlices); - - assert(leftBronchusSlices.size() == rightBronchusSlices.size()); - - std::vector leftPoints; - std::vector rightPoints; - for(uint i=0; i(leftBronchusSlices[i], 0, true, 10); - leftBronchusSlices[i] = KeepLabels(leftBronchusSlices[i], - GetBackgroundValue(), - GetForegroundValue(), 1, 1, true); - rightBronchusSlices[i] = Labelize(rightBronchusSlices[i], 0, true, 10); - rightBronchusSlices[i] = KeepLabels(rightBronchusSlices[i], - GetBackgroundValue(), - GetForegroundValue(), 1, 1, true); - double distance_max_from_center_point = 15; - - // ------- Find point in left Bronchus ------- - // find right most point in left = rightMost - SliceType::PointType a; - SliceType::PointType rightMost = - clitk::FindExtremaPointInAGivenDirection(leftBronchusSlices[i], - GetBackgroundValue(), - 0, false, a, 0); - // find post most point in left, not far away from rightMost - SliceType::PointType p = - clitk::FindExtremaPointInAGivenDirection(leftBronchusSlices[i], - GetBackgroundValue(), - 1, false, rightMost, - distance_max_from_center_point); - MaskImageType::PointType pp; - pp[0] = p[0]; pp[1] = p[1]; - pp[2] = i*leftBronchus->GetSpacing()[2] + leftBronchus->GetOrigin()[2]; - leftPoints.push_back(pp); - - // ------- Find point in right Bronchus ------- - // find left most point in right = leftMost - SliceType::PointType leftMost = - clitk::FindExtremaPointInAGivenDirection(rightBronchusSlices[i], - GetBackgroundValue(), - 0, true, a, 0); - // find post most point in left, not far away from leftMost - p = clitk::FindExtremaPointInAGivenDirection(rightBronchusSlices[i], - GetBackgroundValue(), - 1, false, leftMost, - distance_max_from_center_point); - pp[0] = p[0]; pp[1] = p[1]; - pp[2] = i*rightBronchus->GetSpacing()[2] + rightBronchus->GetOrigin()[2]; - rightPoints.push_back(pp); - } - - // DEBUG - std::ofstream osl; - openFileForWriting(osl, "left.txt"); - osl << "LANDMARKS1" << std::endl; - std::ofstream osr; - openFileForWriting(osr, "right.txt"); - osr << "LANDMARKS1" << std::endl; - for(uint i=0; i to accelerate, start with formula, when change sign -> stop and fill - */ - // typedef itk::ImageSliceIteratorWithIndex SliceIteratorType; - iter = SliceIteratorType(m_working_mediastinum, m_working_mediastinum->GetLargestPossibleRegion()); - iter.SetFirstDirection(0); - iter.SetSecondDirection(1); - iter.GoToBegin(); - int i=0; - MaskImageType::PointType A; - MaskImageType::PointType B; - MaskImageType::PointType C; - while (!iter.IsAtEnd()) { - A = leftPoints[i]; - B = rightPoints[i]; - C = A; - C[1] -= 10; // I know I must keep this point - double s = (B[0] - A[0]) * (C[1] - A[1]) - (B[1] - A[1]) * (C[0] - A[0]); - bool isPositive = s<0; - while (!iter.IsAtEndOfSlice()) { - while (!iter.IsAtEndOfLine()) { - // Very slow, I know ... but image should be very small - m_working_mediastinum->TransformIndexToPhysicalPoint(iter.GetIndex(), C); - double s = (B[0] - A[0]) * (C[1] - A[1]) - (B[1] - A[1]) * (C[0] - A[0]); - if (s == 0) iter.Set(2); - if (isPositive) { - if (s > 0) iter.Set(GetBackgroundValue()); - } - else { - if (s < 0) iter.Set(GetBackgroundValue()); - } - ++iter; - } - iter.NextLine(); - } - iter.NextSlice(); - ++i; - } - - //----------------------------------------------------- - //----------------------------------------------------- - // StartNewStep("Anterior limits"); - - - // MISSING FROM NOW - - // Station 4R, Station 4L, the right pulmonary artery, and/or the - // left superior pulmonary vein - - - //----------------------------------------------------- - //----------------------------------------------------- - // ALSO SUBSTRACT ARTERY/VEIN (initially in the support) - - - // Set output image information (required) - MaskImagePointer outputImage = this->GetOutput(0); - outputImage->SetRegions(m_working_mediastinum->GetLargestPossibleRegion()); - outputImage->SetOrigin(m_working_mediastinum->GetOrigin()); - outputImage->SetRequestedRegion(m_working_mediastinum->GetLargestPossibleRegion()); - -} -//-------------------------------------------------------------------- - - -//-------------------------------------------------------------------- -template -void -clitk::ExtractLymphStationsFilter:: -GenerateInputRequestedRegion() { - DD("GenerateInputRequestedRegion"); - // Call default - // Superclass::GenerateInputRequestedRegion(); - // Following needed because output region can be greater than input (trachea) - //ImagePointer mediastinum = dynamic_cast(itk::ProcessObject::GetInput(0)); - //ImagePointer trachea = dynamic_cast(itk::ProcessObject::GetInput(1)); - DD("set reg"); - m_mediastinum->SetRequestedRegion(m_mediastinum->GetLargestPossibleRegion()); - m_trachea->SetRequestedRegion(m_trachea->GetLargestPossibleRegion()); - DD("end"); -} -//-------------------------------------------------------------------- - - -//-------------------------------------------------------------------- -template -void -clitk::ExtractLymphStationsFilter:: -GenerateData() { - DD("GenerateData"); - // Final Step -> graft output (if SetNthOutput => redo) - this->GraftOutput(m_output); -} -//-------------------------------------------------------------------- - - -#endif //#define CLITKBOOLEANOPERATORLABELIMAGEFILTER_TXX diff --git a/segmentation/clitkExtractLymphStationsFilter.txx b/segmentation/clitkExtractLymphStationsFilter.txx index ec93c09..6686923 100644 --- a/segmentation/clitkExtractLymphStationsFilter.txx +++ b/segmentation/clitkExtractLymphStationsFilter.txx @@ -438,7 +438,7 @@ FindCarina() z = this->GetAFDB()->GetDouble("CarinaZ"); } catch(clitk::ExceptionObject e) { - DD("FindCarinaSlicePosition"); + //DD("FindCarinaSlicePosition"); // Get Carina MaskImagePointer Carina = this->GetAFDB()->template GetImage("Carina"); @@ -471,7 +471,7 @@ FindApexOfTheChest() z = this->GetAFDB()->GetDouble("ApexOfTheChestZ"); } catch(clitk::ExceptionObject e) { - DD("FindApexOfTheChestPosition"); + //DD("FindApexOfTheChestPosition"); MaskImagePointer Lungs = this->GetAFDB()->template GetImage("Lungs"); MaskImagePointType p; p[0] = p[1] = p[2] = 0.0; // to avoid warning @@ -596,7 +596,7 @@ FindSuperiorBorderOfAorticArch() z = this->GetAFDB()->GetDouble("SuperiorBorderOfAorticArchZ"); } catch(clitk::ExceptionObject e) { - DD("FindSuperiorBorderOfAorticArch"); + // DD("FindSuperiorBorderOfAorticArch"); MaskImagePointer Aorta = this->GetAFDB()->template GetImage("Aorta"); MaskImagePointType p; p[0] = p[1] = p[2] = 0.0; // to avoid warning @@ -628,7 +628,7 @@ FindInferiorBorderOfAorticArch() z = this->GetAFDB()->GetDouble("InferiorBorderOfAorticArchZ"); } catch(clitk::ExceptionObject e) { - DD("FindInferiorBorderOfAorticArch"); + //DD("FindInferiorBorderOfAorticArch"); MaskImagePointer Aorta = this->GetAFDB()->template GetImage("Aorta"); std::vector slices; clitk::ExtractSlices(Aorta, 2, slices); diff --git a/segmentation/clitkExtractLymphStationsFilter.txx.save b/segmentation/clitkExtractLymphStationsFilter.txx.save deleted file mode 100644 index a7b3244..0000000 --- a/segmentation/clitkExtractLymphStationsFilter.txx.save +++ /dev/null @@ -1,289 +0,0 @@ -/*========================================================================= - Program: vv http://www.creatis.insa-lyon.fr/rio/vv - - Authors belong to: - - University of LYON http://www.universite-lyon.fr/ - - Léon Bérard cancer center http://oncora1.lyon.fnclcc.fr - - CREATIS CNRS laboratory http://www.creatis.insa-lyon.fr - - This software is distributed WITHOUT ANY WARRANTY; without even - the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR - PURPOSE. See the copyright notices for more information. - - It is distributed under dual licence - - - BSD See included LICENSE.txt file - - CeCILL-B http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html - ======================================================================-====*/ - -#ifndef CLITKEXTRACTLYMPHSTATIONSFILTER_TXX -#define CLITKEXTRACTLYMPHSTATIONSFILTER_TXX - -// clitk -#include "clitkCommon.h" -#include "clitkExtractLymphStationsFilter.h" -#include "clitkAddRelativePositionConstraintToLabelImageFilter.h" -#include "clitkSegmentationUtils.h" -#include "clitkAutoCropFilter.h" -#include "clitkSegmentationUtils.h" -#include "clitkSliceBySliceRelativePositionFilter.h" - -// itk -#include -#include -#include -#include -#include -#include - -// itk ENST -#include "RelativePositionPropImageFilter.h" - -//-------------------------------------------------------------------- -template -clitk::ExtractLymphStationsFilter:: -ExtractLymphStationsFilter(): - clitk::FilterBase(), - clitk::FilterWithAnatomicalFeatureDatabaseManagement(), - itk::ImageToImageFilter() -{ - this->SetNumberOfRequiredInputs(1); - SetBackgroundValue(0); - SetForegroundValue(1); -} -//-------------------------------------------------------------------- - - -//-------------------------------------------------------------------- -template -void -clitk::ExtractLymphStationsFilter:: -GenerateOutputInformation() { - // Superclass::GenerateOutputInformation(); - - // Get input - LoadAFDB(); - m_mediastinum = GetAFDB()->template GetImage ("mediastinum"); - m_trachea = GetAFDB()->template GetImage ("trachea"); - ImagePointType carina; - GetAFDB()->GetPoint3D("carina", carina); - DD(carina); - m_CarinaZPositionInMM = carina[2]; - DD(m_CarinaZPositionInMM); - ImagePointType mlb; - GetAFDB()->GetPoint3D("middleLobeBronchus", mlb); - m_MiddleLobeBronchusZPositionInMM = mlb[2]; - DD(m_MiddleLobeBronchusZPositionInMM); - - // ---------------------------------------------------------------- - // ---------------------------------------------------------------- - // Superior limit = carina - // Inferior limit = origin right middle lobe bronchus - StartNewStep("Inf/Sup mediastinum limits with carina/bronchus"); - ImageRegionType region = m_mediastinum->GetLargestPossibleRegion(); DD(region); - ImageSizeType size = region.GetSize(); - ImageIndexType index = region.GetIndex(); - DD(m_CarinaZPositionInMM); - DD(m_MiddleLobeBronchusZPositionInMM); - index[2] = floor((m_MiddleLobeBronchusZPositionInMM - m_mediastinum->GetOrigin()[2]) / m_mediastinum->GetSpacing()[2]); - size[2] = 1+ceil((m_CarinaZPositionInMM-m_MiddleLobeBronchusZPositionInMM) / m_mediastinum->GetSpacing()[2]); // +1 to - region.SetSize(size); - region.SetIndex(index); - DD(region); - typedef itk::RegionOfInterestImageFilter CropFilterType; - typename CropFilterType::Pointer cropFilter = CropFilterType::New(); - cropFilter->SetInput(m_mediastinum); - cropFilter->SetRegionOfInterest(region); - cropFilter->Update(); - m_working_image = cropFilter->GetOutput(); - // Auto Crop (because following rel pos is faster) - m_working_image = clitk::AutoCrop(m_working_image, 0); - StopCurrentStep(m_working_image); - m_output = m_working_image; - - // ---------------------------------------------------------------- - // ---------------------------------------------------------------- - // Separate trachea in two CCL - StartNewStep("Separate trachea under carina"); - // DD(region); - ImageRegionType trachea_region = m_trachea->GetLargestPossibleRegion(); - for(int i=0; i<3; i++) { - index[i] = floor(((index[i]*m_mediastinum->GetSpacing()[i])+m_mediastinum->GetOrigin()[i] - -m_trachea->GetOrigin()[i])/m_trachea->GetSpacing()[i]); - // DD(index[i]); - size[i] = ceil((size[i]*m_mediastinum->GetSpacing()[i])/m_trachea->GetSpacing()[i]); - // DD(size[i]); - if (index[i] < 0) { - size[i] += index[i]; - index[i] = 0; - } - if (size[i]+index[i] > (trachea_region.GetSize()[i] + trachea_region.GetIndex()[i])) { - size[i] = trachea_region.GetSize()[i] + trachea_region.GetIndex()[i] - index[i]; - } - } - // DD(index); - // DD(size); - region.SetIndex(index); - region.SetSize(size); - // typedef itk::RegionOfInterestImageFilter CropFilterType; - // typename CropFilterType::Pointer - cropFilter = CropFilterType::New(); - // m_trachea.Print(std::cout); - cropFilter->SetInput(m_trachea); - cropFilter->SetRegionOfInterest(region); - cropFilter->Update(); - m_working_trachea = cropFilter->GetOutput(); - - // Labelize and consider two main labels - m_working_trachea = Labelize(m_working_trachea, 0, true, 1); - - // Detect wich label is at Left - typedef itk::ImageSliceConstIteratorWithIndex SliceIteratorType; - SliceIteratorType iter(m_working_trachea, m_working_trachea->GetLargestPossibleRegion()); - iter.SetFirstDirection(0); - iter.SetSecondDirection(1); - iter.GoToBegin(); - bool stop = false; - ImagePixelType leftLabel; - ImagePixelType rightLabel; - while (!stop) { - if (iter.Get() != GetBackgroundValue()) { - // DD(iter.GetIndex()); - // DD((int)iter.Get()); - leftLabel = iter.Get(); - stop = true; - } - ++iter; - } - if (leftLabel == 1) rightLabel = 2; - else rightLabel = 1; - DD((int)leftLabel); - DD((int)rightLabel); - - // End step - StopCurrentStep(m_working_trachea); - - //----------------------------------------------------- - /* DD("TEST Skeleton"); - typedef itk::BinaryThinningImageFilter SkeletonFilterType; - typename SkeletonFilterType::Pointer skeletonFilter = SkeletonFilterType::New(); - skeletonFilter->SetInput(m_working_trachea); - skeletonFilter->Update(); - writeImage(skeletonFilter->GetOutput(), "skel.mhd"); - writeImage(skeletonFilter->GetThinning(), "skel2.mhd"); - */ - - //----------------------------------------------------- - StartNewStep("Left limits with bronchus (slice by slice)"); - // Select LeftLabel (set right label to 0) - MaskImagePointer temp = SetBackground(m_working_trachea, m_working_trachea, rightLabel, 0); - writeImage(temp, "temp1.mhd"); - - m_working_image = - clitk::SliceBySliceRelativePosition(m_working_image, - temp, - 2, GetFuzzyThreshold(), "RightTo"); - /* - typedef clitk::SliceBySliceRelativePositionFilter SliceRelPosFilterType; - typename SliceRelPosFilterType::Pointer sliceRelPosFilter = SliceRelPosFilterType::New(); - sliceRelPosFilter->SetCurrentStepBaseId(this->GetCurrentStepId()); - sliceRelPosFilter->VerboseStepOn(); - sliceRelPosFilter->WriteStepOn(); - sliceRelPosFilter->SetInput(m_working_image); - sliceRelPosFilter->SetInputObject(temp); - sliceRelPosFilter->SetDirection(2); - sliceRelPosFilter->SetFuzzyThreshold(GetFuzzyThreshold()); - sliceRelPosFilter->SetOrientationTypeString("RightTo"); - sliceRelPosFilter->Update(); - m_working_image = sliceRelPosFilter->GetOutput();*/ - writeImage(m_working_image, "afterslicebyslice.mhd"); - - - typedef clitk::SliceBySliceRelativePositionFilter SliceRelPosFilterType; - typename SliceRelPosFilterType::Pointer sliceRelPosFilter = SliceRelPosFilterType::New(); - - - //----------------------------------------------------- - StartNewStep("Right limits with bronchus (slice by slice)"); - // Select LeftLabel (set right label to 0) - temp = SetBackground(m_working_trachea, m_working_trachea, leftLabel, 0); - writeImage(temp, "temp2.mhd"); - - sliceRelPosFilter = SliceRelPosFilterType::New(); - sliceRelPosFilter->SetCurrentStepBaseId(this->GetCurrentStepId()); - sliceRelPosFilter->VerboseStepOff(); - sliceRelPosFilter->WriteStepOff(); - sliceRelPosFilter->SetInput(m_working_image); - sliceRelPosFilter->SetInputObject(temp); - sliceRelPosFilter->SetDirection(2); - sliceRelPosFilter->SetFuzzyThreshold(GetFuzzyThreshold()); - sliceRelPosFilter->SetOrientationTypeString("LeftTo"); - sliceRelPosFilter->Update(); - m_working_image = sliceRelPosFilter->GetOutput(); - writeImage(m_working_image, "afterslicebyslice.mhd"); - DD("end"); - m_output = m_working_image; - StopCurrentStep(m_output); - - //----------------------------------------------------- - StartNewStep("Trial Post position according to trachea"); - // Post: do not extend past the post wall of the 2 main bronchi - sliceRelPosFilter = SliceRelPosFilterType::New(); - sliceRelPosFilter->SetCurrentStepBaseId(this->GetCurrentStepId()); - sliceRelPosFilter->VerboseStepOn(); - sliceRelPosFilter->WriteStepOn(); - sliceRelPosFilter->SetInput(m_output); - sliceRelPosFilter->SetInputObject(m_trachea); - sliceRelPosFilter->SetDirection(2); - sliceRelPosFilter->SetFuzzyThreshold(GetFuzzyThreshold()); - // It means "not PostTo" (different from AntTo) - sliceRelPosFilter->NotFlagOn(); - //sliceRelPosFilter->SetOrientationType(SliceRelPosFilterType::RelPosFilterType::PostTo); - sliceRelPosFilter->SetOrientationTypeString("PostTo"); - sliceRelPosFilter->Update(); - m_output = sliceRelPosFilter->GetOutput(); - writeImage(m_output, "postrelpos.mhd"); - - - // Set output image information (required) - MaskImagePointer outputImage = this->GetOutput(0); - outputImage->SetRegions(m_working_image->GetLargestPossibleRegion()); - outputImage->SetOrigin(m_working_image->GetOrigin()); - outputImage->SetRequestedRegion(m_working_image->GetLargestPossibleRegion()); - DD("end2"); -} -//-------------------------------------------------------------------- - - -//-------------------------------------------------------------------- -template -void -clitk::ExtractLymphStationsFilter:: -GenerateInputRequestedRegion() { - DD("GenerateInputRequestedRegion"); - // Call default - // Superclass::GenerateInputRequestedRegion(); - // Following needed because output region can be greater than input (trachea) - //ImagePointer mediastinum = dynamic_cast(itk::ProcessObject::GetInput(0)); - //ImagePointer trachea = dynamic_cast(itk::ProcessObject::GetInput(1)); - DD("set reg"); - m_mediastinum->SetRequestedRegion(m_mediastinum->GetLargestPossibleRegion()); - m_trachea->SetRequestedRegion(m_trachea->GetLargestPossibleRegion()); - DD("end"); -} -//-------------------------------------------------------------------- - - -//-------------------------------------------------------------------- -template -void -clitk::ExtractLymphStationsFilter:: -GenerateData() { - DD("GenerateData"); - // Final Step -> graft output (if SetNthOutput => redo) - this->GraftOutput(m_output); -} -//-------------------------------------------------------------------- - - -#endif //#define CLITKBOOLEANOPERATORLABELIMAGEFILTER_TXX diff --git a/tools/CMakeLists.txt b/tools/CMakeLists.txt index 5222f12..4bd6e15 100644 --- a/tools/CMakeLists.txt +++ b/tools/CMakeLists.txt @@ -315,6 +315,11 @@ IF (CLITK_BUILD_TOOLS) TARGET_LINK_LIBRARIES(clitkRelativePosition clitkCommon ${ITK_LIBRARIES}) SET(TOOLS_INSTALL ${TOOLS_INSTALL} clitkRelativePosition) + WRAP_GGO(clitkRelativePositionAnalyzer_GGO_C clitkRelativePositionAnalyzer.ggo) + ADD_EXECUTABLE(clitkRelativePositionAnalyzer clitkRelativePositionAnalyzer.cxx ${clitkRelativePositionAnalyzer_GGO_C}) + TARGET_LINK_LIBRARIES(clitkRelativePositionAnalyzer clitkCommon ${ITK_LIBRARIES}) + SET(TOOLS_INSTALL ${TOOLS_INSTALL} clitkRelativePositionAnalyzer) + WRAP_GGO(clitkTransformLandmarks_GGO_C clitkTransformLandmarks.ggo) ADD_EXECUTABLE(clitkTransformLandmarks clitkTransformLandmarks.cxx ${clitkTransformLandmarks_GGO_C}) TARGET_LINK_LIBRARIES(clitkTransformLandmarks clitkCommon ${ITK_LIBRARIES}) diff --git a/tools/clitkRelativePositionAnalyzer.cxx b/tools/clitkRelativePositionAnalyzer.cxx new file mode 100644 index 0000000..9b16e51 --- /dev/null +++ b/tools/clitkRelativePositionAnalyzer.cxx @@ -0,0 +1,45 @@ +/*========================================================================= + Program: vv http://www.creatis.insa-lyon.fr/rio/vv + + Authors belong to: + - University of LYON http://www.universite-lyon.fr/ + - Léon Bérard cancer center http://www.centreleonberard.fr + - CREATIS CNRS laboratory http://www.creatis.insa-lyon.fr + + This software is distributed WITHOUT ANY WARRANTY; without even + the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + PURPOSE. See the copyright notices for more information. + + It is distributed under dual licence + + - BSD See included LICENSE.txt file + - CeCILL-B http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html +===========================================================================**/ + +// clitk +#include "clitkRelativePositionAnalyzer_ggo.h" +#include "clitkRelativePositionAnalyzerGenericFilter.h" + +//-------------------------------------------------------------------- +int main(int argc, char * argv[]) { + + // Init command line + GGO(clitkRelativePositionAnalyzer, args_info); + CLITK_INIT; + + // Filter + typedef clitk::RelativePositionAnalyzerGenericFilter FilterType; + FilterType::Pointer filter = FilterType::New(); + + filter->SetArgsInfo(args_info); + + try { + filter->Update(); + } catch(std::runtime_error e) { + std::cout << e.what() << std::endl; + return EXIT_FAILURE; + } + + return EXIT_SUCCESS; +} // This is the end, my friend +//-------------------------------------------------------------------- diff --git a/tools/clitkRelativePositionAnalyzer.ggo b/tools/clitkRelativePositionAnalyzer.ggo new file mode 100644 index 0000000..982792c --- /dev/null +++ b/tools/clitkRelativePositionAnalyzer.ggo @@ -0,0 +1,16 @@ +#File clitkRelativePositionAnalyzer.ggo +package "clitkRelativePositionAnalyzer" +version "1.0" +purpose "Analyze relative position of a target according to structures" + +section "General options" +option "config" - "Config file" string no +option "verbose" v "Verbose" flag off +option "imagetypes" - "Display allowed image types" flag off + +section "Input/Output" +option "support" i "Input mask support" string yes +option "object" j "Input mask object" string yes +option "target" t "Input mask target" string yes +option "output" o "Output image " string yes + diff --git a/tools/clitkRelativePositionAnalyzerGenericFilter.h b/tools/clitkRelativePositionAnalyzerGenericFilter.h new file mode 100644 index 0000000..fb5648a --- /dev/null +++ b/tools/clitkRelativePositionAnalyzerGenericFilter.h @@ -0,0 +1,75 @@ +/*========================================================================= + Program: vv http://www.creatis.insa-lyon.fr/rio/vv + + Authors belong to: + - University of LYON http://www.universite-lyon.fr/ + - Léon Bérard cancer center http://www.centreleonberard.fr + - CREATIS CNRS laboratory http://www.creatis.insa-lyon.fr + + This software is distributed WITHOUT ANY WARRANTY; without even + the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + PURPOSE. See the copyright notices for more information. + + It is distributed under dual licence + + - BSD See included LICENSE.txt file + - CeCILL-B http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html +===========================================================================**/ + +#ifndef CLITKRELATIVEPOSITIONANALYZERGENERICFILTER_H +#define CLITKRELATIVEPOSITIONANALYZERGENERICFILTER_H + +// clitk +#include "clitkIO.h" +#include "clitkImageToImageGenericFilter.h" +#include "clitkRelativePositionAnalyzerFilter.h" + +//-------------------------------------------------------------------- +namespace clitk +{ + + template + class ITK_EXPORT RelativePositionAnalyzerGenericFilter: + public ImageToImageGenericFilter > + { + public: + //-------------------------------------------------------------------- + RelativePositionAnalyzerGenericFilter(); + + //-------------------------------------------------------------------- + typedef ImageToImageGenericFilter > Superclass; + typedef RelativePositionAnalyzerGenericFilter Self; + typedef itk::SmartPointer Pointer; + typedef itk::SmartPointer ConstPointer; + + //-------------------------------------------------------------------- + itkNewMacro(Self); + itkTypeMacro(RelativePositionAnalyzerGenericFilter, LightObject); + + //-------------------------------------------------------------------- + void SetArgsInfo(const ArgsInfoType & a); + template + void SetOptionsFromArgsInfoToFilter(FilterType * f) ; + + //-------------------------------------------------------------------- + // Main function called each time the filter is updated + template + void UpdateWithInputImageType(); + + protected: + template void InitializeImageType(); + ArgsInfoType mArgsInfo; + + private: + RelativePositionAnalyzerGenericFilter(const Self&); //purposely not implemented + void operator=(const Self&); //purposely not implemented + + };// end class + //-------------------------------------------------------------------- +} // end namespace clitk + +#ifndef ITK_MANUAL_INSTANTIATION +#include "clitkRelativePositionAnalyzerGenericFilter.txx" +#endif + +#endif // #define CLITKRELATIVEPOSITIONANALYZERGENERICFILTER_H diff --git a/tools/clitkRelativePositionAnalyzerGenericFilter.txx b/tools/clitkRelativePositionAnalyzerGenericFilter.txx new file mode 100644 index 0000000..4225c43 --- /dev/null +++ b/tools/clitkRelativePositionAnalyzerGenericFilter.txx @@ -0,0 +1,103 @@ +/*========================================================================= + Program: vv http://www.creatis.insa-lyon.fr/rio/vv + + Authors belong to: + - University of LYON http://www.universite-lyon.fr/ + - Léon Bérard cancer center http://www.centreleonberard.fr + - CREATIS CNRS laboratory http://www.creatis.insa-lyon.fr + + This software is distributed WITHOUT ANY WARRANTY; without even + the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + PURPOSE. See the copyright notices for more information. + + It is distributed under dual licence + + - BSD See included LICENSE.txt file + - CeCILL-B http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html + ===========================================================================**/ + +//-------------------------------------------------------------------- +template +clitk::RelativePositionAnalyzerGenericFilter:: +RelativePositionAnalyzerGenericFilter(): + ImageToImageGenericFilter("RelativePositionAnalyzer") +{ + // Default values + cmdline_parser_clitkRelativePositionAnalyzer_init(&mArgsInfo); + InitializeImageType<3>(); +} +//-------------------------------------------------------------------- + + +//-------------------------------------------------------------------- +template +template +void clitk::RelativePositionAnalyzerGenericFilter:: +InitializeImageType() +{ + ADD_IMAGE_TYPE(Dim, uchar); +} +//-------------------------------------------------------------------- + + +//-------------------------------------------------------------------- +template +void clitk::RelativePositionAnalyzerGenericFilter:: +SetArgsInfo(const ArgsInfoType & a) +{ + mArgsInfo=a; + SetIOVerbose(mArgsInfo.verbose_flag); + if (mArgsInfo.imagetypes_flag) this->PrintAvailableImageTypes(); + if (mArgsInfo.support_given) AddInputFilename(mArgsInfo.support_arg); + if (mArgsInfo.object_given) AddInputFilename(mArgsInfo.object_arg); + if (mArgsInfo.target_given) AddInputFilename(mArgsInfo.target_arg); + if (mArgsInfo.output_given) AddOutputFilename(mArgsInfo.output_arg); +} +//-------------------------------------------------------------------- + + +//-------------------------------------------------------------------- +// Update with the number of dimensions and the pixeltype +//-------------------------------------------------------------------- +template +template +void clitk::RelativePositionAnalyzerGenericFilter:: +SetOptionsFromArgsInfoToFilter(FilterType * f) +{ + +} + +//-------------------------------------------------------------------- +// Update with the number of dimensions and the pixeltype +//-------------------------------------------------------------------- +template +template +void clitk::RelativePositionAnalyzerGenericFilter:: +UpdateWithInputImageType() +{ + // Reading input + typename ImageType::Pointer support = this->template GetInput(0); + typename ImageType::Pointer object = this->template GetInput(1); + typename ImageType::Pointer target = this->template GetInput(2); + + // Create filter + typedef clitk::RelativePositionAnalyzerFilter FilterType; + typename FilterType::Pointer filter = FilterType::New(); + + // Set global Options + filter->SetInputSupport(support); + filter->SetInputObject(object); + filter->SetInputTarget(target); + SetOptionsFromArgsInfoToFilter(filter); + + // Go ! + filter->Update(); + + // Write/Save results + // typename ImageType::Pointer output = filter->GetOutput(); + //this->template SetNextOutput(output); + +} +//-------------------------------------------------------------------- + + diff --git a/tools/clitkRelativePositionGenericFilter.h b/tools/clitkRelativePositionGenericFilter.h index 84ac3e0..bb9ec6f 100644 --- a/tools/clitkRelativePositionGenericFilter.h +++ b/tools/clitkRelativePositionGenericFilter.h @@ -16,8 +16,8 @@ - CeCILL-B http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html ===========================================================================**/ -#ifndef CLITKEXTRACTPATIENTGENERICFILTER_H -#define CLITKEXTRACTPATIENTGENERICFILTER_H +#ifndef CLITKRELATIVEPOSITIONGENERICFILTER_H +#define CLITKRELATIVEPOSITIONGENERICFILTER_H // clitk #include "clitkIO.h" @@ -73,4 +73,4 @@ namespace clitk #include "clitkRelativePositionGenericFilter.txx" #endif -#endif // #define CLITKEXTRACTPATIENTGENERICFILTER_H +#endif // #define CLITKRELATIVEPOSITIONGENERICFILTER_H diff --git a/tools/clitkRelativePositionGenericFilter.txx b/tools/clitkRelativePositionGenericFilter.txx index 66c4be4..4114e55 100644 --- a/tools/clitkRelativePositionGenericFilter.txx +++ b/tools/clitkRelativePositionGenericFilter.txx @@ -69,6 +69,9 @@ SetOptionsFromArgsInfoToFilter(FilterType * f) f->SetVerboseStepFlag(mArgsInfo.verboseStep_flag); f->SetWriteStepFlag(mArgsInfo.writeStep_flag); + // Must be set before AddOrientationTypeString + f->SetInverseOrientationFlag(mArgsInfo.inverse_flag); + for(uint i=0; iAddOrientationTypeString(mArgsInfo.orientation_arg[i]); } @@ -85,8 +88,6 @@ SetOptionsFromArgsInfoToFilter(FilterType * f) f->SetRemoveObjectFlag(!mArgsInfo.doNotRemoveObject_flag); f->SetAutoCropFlag(!mArgsInfo.noAutoCrop_flag); f->SetCombineWithOrFlag(mArgsInfo.combineWithOr_flag); - f->SetInverseOrientationFlag(mArgsInfo.inverse_flag); - } //--------------------------------------------------------------------