X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=itk%2FclitkSegmentationUtils.h;h=7daf3c8345405463e12a47a459a5487da2847aa2;hb=1c1a921431ce1b0d80279211bd3a12fa9c4ae7bd;hp=aa95de4898278a36581ec2f47e714e705a281f2c;hpb=b24d2dc847c898f19fe694c8e05878c27d5f8011;p=clitk.git diff --git a/itk/clitkSegmentationUtils.h b/itk/clitkSegmentationUtils.h index aa95de4..7daf3c8 100644 --- a/itk/clitkSegmentationUtils.h +++ b/itk/clitkSegmentationUtils.h @@ -19,19 +19,30 @@ #ifndef CLITKSEGMENTATIONUTILS_H #define CLITKSEGMENTATIONUTILS_H +// clitk #include "clitkCommon.h" #include "clitkAutoCropFilter.h" #include "clitkLabelizeParameters.h" +#include "clitkExtractSliceFilter.h" + +// itk #include +#include + +/* + According to + http://answerpot.com/showthread.php?357451-Itk::SmartPointer%20-%20problem%20making%20code%20const-correct + it is better to take raw pointer as argument instead of SmartPointer. +*/ namespace clitk { //-------------------------------------------------------------------- template - void ComputeBBFromImageRegion(typename ImageType::Pointer image, + void ComputeBBFromImageRegion(const ImageType * image, typename ImageType::RegionType region, typename itk::BoundingBox::Pointer bb); + ImageType::ImageDimension>::Pointer bb); //-------------------------------------------------------------------- template @@ -41,49 +52,48 @@ namespace clitk { //-------------------------------------------------------------------- template - void ComputeRegionFromBB(typename ImageType::Pointer image, + void ComputeRegionFromBB(const ImageType * image, const typename itk::BoundingBox::Pointer bb, + ImageType::ImageDimension>::Pointer bb, typename ImageType::RegionType & region); //-------------------------------------------------------------------- template typename TInternalImageType::Pointer - SetBackground(typename TInternalImageType::ConstPointer input, - typename TMaskInternalImageType::ConstPointer mask, + SetBackground(const TInternalImageType * input, + const TMaskInternalImageType * mask, typename TMaskInternalImageType::PixelType maskBG, - typename TInternalImageType::PixelType outValue); + typename TInternalImageType::PixelType outValue, + bool inPlace); //-------------------------------------------------------------------- - + //-------------------------------------------------------------------- - 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 + int GetNumberOfConnectedComponentLabels(const ImageType * input, + typename ImageType::PixelType BG, + bool isFullyConnected); //-------------------------------------------------------------------- //-------------------------------------------------------------------- template typename TImageType::Pointer - Labelize(typename TImageType::Pointer input, - typename TImageType::PixelType BG, - bool isFullyConnected, - int minimalComponentSize); + Labelize(const TImageType * input, typename TImageType::PixelType BG, + bool isFullyConnected, int minimalComponentSize); + template + typename TImageType::Pointer + LabelizeAndCountNumberOfObjects(const TImageType * input, + typename TImageType::PixelType BG, + bool isFullyConnected, + int minimalComponentSize, + int & nb); //-------------------------------------------------------------------- //-------------------------------------------------------------------- template typename ImageType::Pointer - RemoveLabels(typename ImageType::Pointer input, + RemoveLabels(const ImageType * input, typename ImageType::PixelType BG, std::vector & labelsToRemove); //-------------------------------------------------------------------- @@ -91,23 +101,23 @@ namespace clitk { //-------------------------------------------------------------------- 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(); + typename ImageType::Pointer + AutoCrop(const ImageType * input, + typename ImageType::PixelType BG) { + typedef clitk::AutoCropFilter AutoCropFilterType; + typename AutoCropFilterType::Pointer autoCropFilter = AutoCropFilterType::New(); + autoCropFilter->SetInput(input); + autoCropFilter->SetBackgroundValue(BG); + autoCropFilter->Update(); + return autoCropFilter->GetOutput(); } - //-------------------------------------------------------------------- //-------------------------------------------------------------------- template typename TImageType::Pointer - KeepLabels(typename TImageType::Pointer input, + KeepLabels(const TImageType * input, typename TImageType::PixelType BG, typename TImageType::PixelType FG, typename TImageType::PixelType firstKeep, @@ -119,7 +129,7 @@ namespace clitk { //-------------------------------------------------------------------- template typename TImageType::Pointer - LabelizeAndSelectLabels(typename TImageType::Pointer input, + LabelizeAndSelectLabels(const TImageType * input, typename TImageType::PixelType BG, typename TImageType::PixelType FG, bool isFullyConnected, @@ -129,10 +139,297 @@ namespace clitk { //-------------------------------------------------------------------- template typename ImageType::Pointer - EnlargeImageLike(typename ImageType::Pointer input, - typename ImageType::Pointer like, - typename ImageType::PixelType BG); + ResizeImageLike(const ImageType * input, + const itk::ImageBase * like, + typename ImageType::PixelType BG); + + + //-------------------------------------------------------------------- + template + typename MaskImageType::Pointer + SliceBySliceRelativePosition(const MaskImageType * input, + const MaskImageType * object, + int direction, + double threshold, + std::string orientation, + bool uniqueConnectedComponent=false, + double spacing=-1, + bool autocropflag=true, + bool singleObjectCCL=true); + + //-------------------------------------------------------------------- + // In a binary image, search for the point belonging to the FG that + // is the most exterma in the direction 'direction' (or in the + // opposite if notFlag is given). + template + bool + FindExtremaPointInAGivenDirection(const ImageType * input, + typename ImageType::PixelType bg, + int direction, bool opposite, + typename ImageType::PointType & p); + + //-------------------------------------------------------------------- + + //-------------------------------------------------------------------- + // Same as above but check that the found point is not more than + // 'distanceMax' away from 'refPoint' + template + bool + FindExtremaPointInAGivenDirection(const ImageType * input, + typename ImageType::PixelType bg, + int direction, bool opposite, + typename ImageType::PointType refPoint, + double distanceMax, + typename ImageType::PointType & p); + + //-------------------------------------------------------------------- + + //-------------------------------------------------------------------- + template + typename ImageType::Pointer + CropImageAlongOneAxis(const ImageType * image, + int dim, double min, double max, + bool autoCrop = false, + typename ImageType::PixelType BG=0); + template + typename ImageType::Pointer + CropImageRemoveGreaterThan(const ImageType * image, + int dim, double min, bool autoCrop = false, + typename ImageType::PixelType BG=0); + template + typename ImageType::Pointer + CropImageRemoveLowerThan(const ImageType * image, + int dim, double max,bool autoCrop = false, + typename ImageType::PixelType BG=0); + //-------------------------------------------------------------------- + + + //-------------------------------------------------------------------- + template + typename itk::LabelMap< itk::ShapeLabelObject >::Pointer + ComputeLabelMap(const ImageType * image, + typename ImageType::PixelType BG, + bool computePerimeterFlag=false); + template + void + ComputeCentroids(const ImageType * image, + typename ImageType::PixelType BG, + std::vector & centroids); + template + void + ComputeCentroids2(const ImageType * image, + typename ImageType::PixelType BG, + std::vector & centroids); + //-------------------------------------------------------------------- + + + //-------------------------------------------------------------------- + template + void + ExtractSlices(const ImageType * image, int direction, + std::vector::Pointer > & slices) + { + typedef ExtractSliceFilter ExtractSliceFilterType; + typedef typename ExtractSliceFilterType::SliceType SliceType; + typename ExtractSliceFilterType::Pointer + extractSliceFilter = ExtractSliceFilterType::New(); + extractSliceFilter->SetInput(image); + extractSliceFilter->SetDirection(direction); + extractSliceFilter->Update(); + extractSliceFilter->GetOutputSlices(slices); + } + //-------------------------------------------------------------------- + + + //-------------------------------------------------------------------- + template + typename ImageType::Pointer + JoinSlices(std::vector::Pointer > & slices, + const ImageType * input, + int direction) { + typedef typename itk::Image SliceType; + typedef itk::JoinSeriesImageFilter JoinSeriesFilterType; + typename JoinSeriesFilterType::Pointer joinFilter = JoinSeriesFilterType::New(); + joinFilter->SetOrigin(input->GetOrigin()[direction]); + joinFilter->SetSpacing(input->GetSpacing()[direction]); + for(unsigned int i=0; iPushBackInput(slices[i]); + } + joinFilter->Update(); + return joinFilter->GetOutput(); + } + //-------------------------------------------------------------------- + + + //-------------------------------------------------------------------- + // Set of tools to manage 3D points and 2D points in slices + template + class PointsUtils + { + typedef typename ImageType::PointType PointType3D; + typedef typename ImageType::IndexType IndexType3D; + typedef typename ImageType::PixelType PixelType; + typedef typename ImageType::Pointer ImagePointer; + typedef typename ImageType::ConstPointer ImageConstPointer; + typedef itk::Image SliceType; + typedef typename SliceType::PointType PointType2D; + typedef typename SliceType::IndexType IndexType2D; + + typedef std::map MapPoint2DType; + typedef std::vector VectorPoint3DType; + typedef std::vector VectorPoint2DType; + + public: + static void Convert2DTo3D(const PointType2D & p2D, + const ImageType * image, + const int slice, + PointType3D & p3D); + static void Convert2DMapTo3DList(const MapPoint2DType & map, + const ImageType * image, + VectorPoint3DType & list); + static void Convert2DListTo3DList(const VectorPoint2DType & p, + int slice, + const ImageType * image, + VectorPoint3DType & list); + }; + + //-------------------------------------------------------------------- + template + void + WriteListOfLandmarks(std::vector points, + std::string filename); + //-------------------------------------------------------------------- + + + //-------------------------------------------------------------------- + template + typename ImageType::Pointer + Dilate(const ImageType * image, double radiusInMM, + typename ImageType::PixelType BG, + typename ImageType::PixelType FG, + bool extendSupport); + template + typename ImageType::Pointer + Dilate(const ImageType * image, typename ImageType::SizeType radius, + typename ImageType::PixelType BG, + typename ImageType::PixelType FG, + bool extendSupport); + template + typename ImageType::Pointer + Dilate(const ImageType * image, typename ImageType::PointType radiusInMM, + typename ImageType::PixelType BG, + typename ImageType::PixelType FG, + bool extendSupport); + //-------------------------------------------------------------------- + + + //-------------------------------------------------------------------- + template + typename ImageType::Pointer + Opening(const ImageType * image, typename ImageType::SizeType radius, + typename ImageType::PixelType BG, typename ImageType::PixelType FG); + //-------------------------------------------------------------------- + + + //-------------------------------------------------------------------- + template + void ConvertOption(std::string optionName, uint given, + ValueType * values, VectorType & p, + uint dim, bool required); +#define ConvertOptionMacro(OPTIONNAME, VAR, DIM, REQUIRED) \ + ConvertOption(#OPTIONNAME, OPTIONNAME##_given, OPTIONNAME##_arg, VAR, DIM, REQUIRED); + //-------------------------------------------------------------------- + + //-------------------------------------------------------------------- + template + void + SliceBySliceSetBackgroundFromLineSeparation(ImageType * input, + std::vector & lA, + std::vector & lB, + typename ImageType::PixelType BG, + int mainDirection, + double offsetToKeep); + //-------------------------------------------------------------------- + + + //-------------------------------------------------------------------- + template + void AndNot(ImageType * input, + const ImageType * object, + typename ImageType::PixelType BG=0); + //-------------------------------------------------------------------- + + + //-------------------------------------------------------------------- + template + typename ImageType::Pointer + Binarize(const ImageType * input, + typename ImageType::PixelType lower, + typename ImageType::PixelType upper, + typename ImageType::PixelType BG=0, + typename ImageType::PixelType FG=1); + //-------------------------------------------------------------------- + + + //-------------------------------------------------------------------- + template + void + GetMinMaxPointPosition(const ImageType * input, + typename ImageType::PointType & min, + typename ImageType::PointType & max); + //-------------------------------------------------------------------- + + //-------------------------------------------------------------------- + template + typename ImageType::PointType + FindExtremaPointInAGivenLine(const ImageType * input, + int dimension, bool inverse, + typename ImageType::PointType p, + typename ImageType::PixelType BG, + double distanceMax); + //-------------------------------------------------------------------- + + //-------------------------------------------------------------------- + template + bool + IsOnTheSameLineSide(PointType C, PointType A, PointType B, PointType like); + //-------------------------------------------------------------------- + + + //-------------------------------------------------------------------- + template + void + SliceBySliceBuildLineSegmentAccordingToExtremaPosition(const ImageType * input, + typename ImageType::PixelType BG, + int sliceDimension, + int extremaDirection, + bool extremaOppositeFlag, + int lineDirection, + double margin, + std::vector & A, + std::vector & B); + //-------------------------------------------------------------------- + + + //-------------------------------------------------------------------- + template + typename ImageType::Pointer + SliceBySliceKeepMainCCL(const ImageType * input, + typename ImageType::PixelType BG, + typename ImageType::PixelType FG); + //-------------------------------------------------------------------- + + + //-------------------------------------------------------------------- + template + typename ImageType::Pointer + Clone(const ImageType * input); + //-------------------------------------------------------------------- + + } #include "clitkSegmentationUtils.txx"