From c5fff0a0f4211d43cb7f9140883da46d84d05117 Mon Sep 17 00:00:00 2001 From: dsarrut Date: Wed, 7 Jul 2010 06:59:27 +0000 Subject: [PATCH] add AutoCrop function --- itk/clitkSegmentationUtils.h | 89 +++++++++++++ itk/clitkSegmentationUtils.txx | 225 ++++++++++++++++++++++++++++----- 2 files changed, 284 insertions(+), 30 deletions(-) diff --git a/itk/clitkSegmentationUtils.h b/itk/clitkSegmentationUtils.h index 3b7a1e5..277dfc7 100644 --- a/itk/clitkSegmentationUtils.h +++ b/itk/clitkSegmentationUtils.h @@ -20,6 +20,8 @@ #define CLITKSEGMENTATIONUTILS_H #include "clitkCommon.h" +#include "clitkAutoCropFilter.h" +#include "clitkLabelizeParameters.h" #include namespace clitk { @@ -43,7 +45,94 @@ namespace clitk { const typename itk::BoundingBox::Pointer bb, typename ImageType::RegionType & region); + //-------------------------------------------------------------------- + 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); + //-------------------------------------------------------------------- + template + typename ImageType::Pointer + EnlargeImageLike(typename ImageType::Pointer input, + typename ImageType::Pointer like, + typename ImageType::PixelType BG); + } #include "clitkSegmentationUtils.txx" diff --git a/itk/clitkSegmentationUtils.txx b/itk/clitkSegmentationUtils.txx index 716e287..7f52aea 100644 --- a/itk/clitkSegmentationUtils.txx +++ b/itk/clitkSegmentationUtils.txx @@ -14,13 +14,22 @@ - 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 +#include //-------------------------------------------------------------------- template void clitk::ComputeBBFromImageRegion(typename ImageType::Pointer image, - typename ImageType::RegionType region, - typename itk::BoundingBox::Pointer bb) { typedef typename ImageType::IndexType IndexType; IndexType firstIndex; @@ -47,8 +56,8 @@ void clitk::ComputeBBFromImageRegion(typename ImageType::Pointer image, //-------------------------------------------------------------------- template void clitk::ComputeBBIntersection(typename itk::BoundingBox::Pointer bbo, - typename itk::BoundingBox::Pointer bbi1, - typename itk::BoundingBox::Pointer bbi2) { + typename itk::BoundingBox::Pointer bbi1, + typename itk::BoundingBox::Pointer bbi2) { typedef itk::BoundingBox BBType; typedef typename BBType::PointType PointType; @@ -70,31 +79,187 @@ void clitk::ComputeBBIntersection(typename itk::BoundingBox - 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); +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]); - } + // 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); + // Create region + region.SetIndex(regionStart); + region.SetSize(regionSize); +} +//-------------------------------------------------------------------- + +//-------------------------------------------------------------------- +template +typename ImageType::Pointer +clitk::SetBackground(typename ImageType::ConstPointer input, + typename TMaskImageType::ConstPointer mask, + typename TMaskImageType::PixelType maskBG, + typename ImageType::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 ImageType::Pointer +clitk::Labelize(typename ImageType::Pointer input, + typename ImageType::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 ImageType::Pointer +clitk::RemoveLabels(typename ImageType::Pointer input, + typename ImageType::PixelType BG, + std::vector & labelsToRemove) { + typename ImageType::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 ImageType::Pointer +clitk::KeepLabels(typename ImageType::Pointer input, + typename ImageType::PixelType BG, + typename ImageType::PixelType FG, + typename ImageType::PixelType firstKeep, + typename ImageType::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 ImageType::Pointer +clitk::LabelizeAndSelectLabels(typename ImageType::Pointer input, + typename ImageType::PixelType BG, + typename ImageType::PixelType FG, + bool isFullyConnected, + int minimalComponentSize, + LabelizeParameters * param) +{ + typename ImageType::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; +} +//-------------------------------------------------------------------- + + +//-------------------------------------------------------------------- +template +typename ImageType::Pointer +clitk::EnlargeImageLike(typename ImageType::Pointer input, + typename ImageType::Pointer like, + typename ImageType::PixelType backgroundValue) +{ + if (!HaveSameSpacing(input, like)) { + FATAL("Images must have the same spacing"); } - //-------------------------------------------------------------------- + + typename ImageType::Pointer output = ImageType::New(); + typename ImageType::SizeType size; + for(unsigned int i=0; iGetLargestPossibleRegion().GetSize()[i]*like->GetSpacing()[i])/ + (double)like->GetSpacing()[i]); + } + // DD(size); + typename ImageType::RegionType region; + region.SetSize(size); + output->SetRegions(region); + output->SetSpacing(like->GetSpacing()); + output->SetOrigin(like->GetOrigin()); + output->Allocate(); + output->FillBuffer(backgroundValue); + typedef itk::PasteImageFilter PasteFilterType; + typename PasteFilterType::Pointer pasteFilter = PasteFilterType::New(); + typename PasteFilterType::InputImageIndexType index; + for(unsigned int i=0; iGetOrigin()[i] - like->GetOrigin()[i])/(double)input->GetSpacing()[i]); + } + // DD(index); + pasteFilter->SetSourceImage(input); + pasteFilter->SetDestinationImage(output); + pasteFilter->SetDestinationIndex(index); + pasteFilter->SetSourceRegion(input->GetLargestPossibleRegion()); + pasteFilter->Update(); + return pasteFilter->GetOutput(); +} +//-------------------------------------------------------------------- -- 2.47.1