From 825277ddef9bbde1f378fec8d140c1ee335dab1b Mon Sep 17 00:00:00 2001 From: dsarrut Date: Wed, 30 Jun 2010 05:59:17 +0000 Subject: [PATCH] some utilities for segmentation --- itk/clitkSegmentationFunctions.h | 111 +++++++++++++++++++++++ itk/clitkSegmentationFunctions.txx | 139 +++++++++++++++++++++++++++++ itk/clitkSegmentationUtils.h | 51 +++++++++++ itk/clitkSegmentationUtils.txx | 100 +++++++++++++++++++++ 4 files changed, 401 insertions(+) create mode 100644 itk/clitkSegmentationFunctions.h create mode 100644 itk/clitkSegmentationFunctions.txx create mode 100644 itk/clitkSegmentationUtils.h create mode 100644 itk/clitkSegmentationUtils.txx diff --git a/itk/clitkSegmentationFunctions.h b/itk/clitkSegmentationFunctions.h new file mode 100644 index 0000000..e39c3e5 --- /dev/null +++ b/itk/clitkSegmentationFunctions.h @@ -0,0 +1,111 @@ +/*========================================================================= + 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 CLITKSEGMENTATIONFUNCTIONS_H +#define CLITKSEGMENTATIONFUNCTIONS_H + +#include "clitkAutoCropFilter.h" + +//-------------------------------------------------------------------- +namespace clitk { + + //-------------------------------------------------------------------- + template + typename TInternalImageType::Pointer + SetBackground(typename TInternalImageType::ConstPointer input, + typename TMaskInternalImageType::ConstPointer mask, + typename TMaskInternalImageType::PixelType maskBG, + typename TInternalImageType::PixelType outValue); + //-------------------------------------------------------------------- + + + //-------------------------------------------------------------------- + template + typename TInternalImageType::Pointer + SetBackground(typename TInternalImageType::Pointer input, + typename TMaskInternalImageType::Pointer mask, + typename TMaskInternalImageType::PixelType maskBG, + typename TInternalImageType::PixelType outValue) { + return SetBackground + (static_cast(input), + static_cast(mask), + maskBG, outValue); + } + //-------------------------------------------------------------------- + + + //-------------------------------------------------------------------- + template + typename TImageType::Pointer + Labelize(typename TImageType::Pointer input, + typename TImageType::PixelType BG, + bool isFullyConnected, + int minimalComponentSize); + //-------------------------------------------------------------------- + + + //-------------------------------------------------------------------- + template + typename TImageType::Pointer + RemoveLabels(typename TImageType::Pointer input, + typename TImageType::PixelType BG, + std::vector & labelsToRemove); + //-------------------------------------------------------------------- + + + //-------------------------------------------------------------------- + template + typename ImageType::Pointer + AutoCrop(typename ImageType::Pointer input, + typename ImageType::PixelType BG) { + typedef clitk::AutoCropFilter AutoCropFilterType; + typename AutoCropFilterType::Pointer autoCropFilter = AutoCropFilterType::New(); + autoCropFilter->SetInput(input); + autoCropFilter->Update(); + return autoCropFilter->GetOutput(); + } + + //-------------------------------------------------------------------- + //-------------------------------------------------------------------- + template + typename TImageType::Pointer + KeepLabels(typename TImageType::Pointer input, + typename TImageType::PixelType BG, + typename TImageType::PixelType FG, + typename TImageType::PixelType firstKeep, + typename TImageType::PixelType lastKeep, + bool useLastKeep); + //-------------------------------------------------------------------- + + + //-------------------------------------------------------------------- + template + typename TImageType::Pointer + LabelizeAndSelectLabels(typename TImageType::Pointer input, + typename TImageType::PixelType BG, + typename TImageType::PixelType FG, + bool isFullyConnected, + int minimalComponentSize, + LabelizeParameters * param); +} +//-------------------------------------------------------------------- + +#include "clitkSegmentationFunctions.txx" +//-------------------------------------------------------------------- + +#endif diff --git a/itk/clitkSegmentationFunctions.txx b/itk/clitkSegmentationFunctions.txx new file mode 100644 index 0000000..6da6b7b --- /dev/null +++ b/itk/clitkSegmentationFunctions.txx @@ -0,0 +1,139 @@ +/*========================================================================= + 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 + ======================================================================-====*/ + +// clitk +#include "clitkSetBackgroundImageFilter.h" + +// itk +#include +#include +#include + +//-------------------------------------------------------------------- +template +typename TImageType::Pointer +clitk::SetBackground(typename TImageType::ConstPointer input, + typename TMaskImageType::ConstPointer mask, + typename TMaskImageType::PixelType maskBG, + typename TImageType::PixelType outValue) { + typedef clitk::SetBackgroundImageFilter SetBackgroundImageFilterType; + typename SetBackgroundImageFilterType::Pointer setBackgroundFilter = SetBackgroundImageFilterType::New(); + setBackgroundFilter->SetInput(input); + setBackgroundFilter->SetInput2(mask); + setBackgroundFilter->SetMaskValue(maskBG); + setBackgroundFilter->SetOutsideValue(outValue); + setBackgroundFilter->Update(); + return setBackgroundFilter->GetOutput(); +} +//-------------------------------------------------------------------- + + +//-------------------------------------------------------------------- +template +typename TImageType::Pointer +clitk::Labelize(typename TImageType::Pointer input, + typename TImageType::PixelType BG, + bool isFullyConnected, + int minimalComponentSize) { + + // Connected Component label + typedef itk::ConnectedComponentImageFilter ConnectFilterType; + typename ConnectFilterType::Pointer connectFilter = ConnectFilterType::New(); + connectFilter->SetInput(input); + connectFilter->SetBackgroundValue(BG); + connectFilter->SetFullyConnected(isFullyConnected); + + // Sort by size and remove too small area. + typedef itk::RelabelComponentImageFilter RelabelFilterType; + typename RelabelFilterType::Pointer relabelFilter = RelabelFilterType::New(); + relabelFilter->InPlaceOn(); + relabelFilter->SetInput(connectFilter->GetOutput()); + relabelFilter->SetMinimumObjectSize(minimalComponentSize); + relabelFilter->Update(); + + // Return result + return relabelFilter->GetOutput(); +} +//-------------------------------------------------------------------- + + +//-------------------------------------------------------------------- +template +typename TImageType::Pointer +clitk::RemoveLabels(typename TImageType::Pointer input, + typename TImageType::PixelType BG, + std::vector & labelsToRemove) { + typename TImageType::Pointer working_image = input; + for (unsigned int i=0; i SetBackgroundImageFilterType; + typename SetBackgroundImageFilterType::Pointer setBackgroundFilter = SetBackgroundImageFilterType::New(); + setBackgroundFilter->SetInput(input); + setBackgroundFilter->SetInput2(input); + setBackgroundFilter->SetMaskValue(labelsToRemove[i]); + setBackgroundFilter->SetOutsideValue(BG); + setBackgroundFilter->Update(); + working_image = setBackgroundFilter->GetOutput(); + } + return working_image; +} +//-------------------------------------------------------------------- + + +//-------------------------------------------------------------------- +template +typename TImageType::Pointer +clitk::KeepLabels(typename TImageType::Pointer input, + typename TImageType::PixelType BG, + typename TImageType::PixelType FG, + typename TImageType::PixelType firstKeep, + typename TImageType::PixelType lastKeep, + bool useLastKeep) { + typedef itk::BinaryThresholdImageFilter BinarizeFilterType; + typename BinarizeFilterType::Pointer binarizeFilter = BinarizeFilterType::New(); + binarizeFilter->SetInput(input); + binarizeFilter->SetLowerThreshold(firstKeep); + if (useLastKeep) binarizeFilter->SetUpperThreshold(lastKeep); + binarizeFilter->SetInsideValue(FG); + binarizeFilter->SetOutsideValue(BG); + binarizeFilter->Update(); + return binarizeFilter->GetOutput(); +} +//-------------------------------------------------------------------- + + +//-------------------------------------------------------------------- +template +typename TImageType::Pointer +clitk::LabelizeAndSelectLabels(typename TImageType::Pointer input, + typename TImageType::PixelType BG, + typename TImageType::PixelType FG, + bool isFullyConnected, + int minimalComponentSize, + LabelizeParameters * param) +{ + typename TImageType::Pointer working_image; + working_image = Labelize(input, BG, isFullyConnected, minimalComponentSize); + working_image = RemoveLabels(working_image, BG, param->GetLabelsToRemove()); + working_image = KeepLabels(working_image, + BG, FG, + param->GetFirstKeep(), + param->GetLastKeep(), + param->GetUseLastKeep()); + return working_image; +} +//-------------------------------------------------------------------- diff --git a/itk/clitkSegmentationUtils.h b/itk/clitkSegmentationUtils.h new file mode 100644 index 0000000..3b7a1e5 --- /dev/null +++ b/itk/clitkSegmentationUtils.h @@ -0,0 +1,51 @@ +/*========================================================================= + 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 CLITKSEGMENTATIONUTILS_H +#define CLITKSEGMENTATIONUTILS_H + +#include "clitkCommon.h" +#include + +namespace clitk { + + //-------------------------------------------------------------------- + template + void ComputeBBFromImageRegion(typename ImageType::Pointer 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(typename ImageType::Pointer image, + const typename itk::BoundingBox::Pointer bb, + typename ImageType::RegionType & region); + +} + +#include "clitkSegmentationUtils.txx" + +#endif diff --git a/itk/clitkSegmentationUtils.txx b/itk/clitkSegmentationUtils.txx new file mode 100644 index 0000000..716e287 --- /dev/null +++ b/itk/clitkSegmentationUtils.txx @@ -0,0 +1,100 @@ +/*========================================================================= + 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 +======================================================================-====*/ + +//-------------------------------------------------------------------- +template +void clitk::ComputeBBFromImageRegion(typename ImageType::Pointer 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] = 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 clitk::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 clitk::ComputeRegionFromBB(typename ImageType::Pointer 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); + } + //-------------------------------------------------------------------- -- 2.47.1