13 #ifndef _mitkCLUtil_HXX 14 #define _mitkCLUtil_HXX 22 #include <Eigen/Dense> 26 #include <itkCheckerBoardImageFilter.h> 27 #include <itkShapedNeighborhoodIterator.h> 28 #include "itkHessianRecursiveGaussianImageFilter.h" 29 #include "itkUnaryFunctorImageFilter.h" 30 #include "vnl/algo/vnl_symmetric_eigensystem.h" 31 #include <itkLaplacianRecursiveGaussianImageFilter.h> 35 #include <itkBinaryBallStructuringElement.h> 36 #include <itkBinaryDilateImageFilter.h> 37 #include <itkBinaryErodeImageFilter.h> 38 #include <itkBinaryFillholeImageFilter.h> 39 #include <itkBinaryMorphologicalClosingImageFilter.h> 40 #include <itkGrayscaleErodeImageFilter.h> 41 #include <itkGrayscaleDilateImageFilter.h> 42 #include <itkGrayscaleFillholeImageFilter.h> 45 #include <itkDiscreteGaussianImageFilter.h> 46 #include <itkSubtractImageFilter.h> 70 AccessByItk_2(image, mitk::CLUtil::itkInsertLabel, maskImage, label);
116 AccessFixedDimensionByItk_2(checkerboard_prediction, mitk::CLUtil::itkInterpolateCheckerboardPrediction,3, checkerboard_mask, outimage);
131 AccessByItk_2(image, mitk::CLUtil::itkLaplacianOfGaussianFilter, sigma1, smoothed);
136 AccessByItk_2(image, mitk::CLUtil::itkHessianOfGaussianFilter, sigma, out);
141 AccessByItk_3(image, mitk::CLUtil::itkLocalHistograms, out, NeighbourhoodSize, Bins);
163 template<
typename TImageType>
164 void mitk::CLUtil::itkProbabilityMap(
const TImageType * sourceImage,
double mean,
double std_dev,
mitk::Image::Pointer& resultImage)
166 itk::Image<double, 3>::Pointer itk_img = itk::Image<double, 3>::New();
167 itk_img->SetRegions(sourceImage->GetLargestPossibleRegion());
168 itk_img->SetOrigin(sourceImage->GetOrigin());
169 itk_img->SetSpacing(sourceImage->GetSpacing());
170 itk_img->SetDirection(sourceImage->GetDirection());
174 itk::ImageRegionConstIterator<TImageType> it(sourceImage,sourceImage->GetLargestPossibleRegion());
175 itk::ImageRegionIterator<itk::Image<double, 3> > outit(itk_img,itk_img->GetLargestPossibleRegion());
179 double x = it.Value();
181 double prob = (1.0/(std_dev*std::sqrt(2.0*itk::Math::pi))) * std::exp(-(((x-mean)*(x-mean))/(2.0*std_dev*std_dev)));
190 template<
typename TImageType >
193 typename TImageType::Pointer itk_checkerboard_mask;
196 typename TImageType::Pointer itk_outimage = TImageType::New();
197 itk_outimage->SetRegions(checkerboard_prediction->GetLargestPossibleRegion());
198 itk_outimage->SetDirection(checkerboard_prediction->GetDirection());
199 itk_outimage->SetOrigin(checkerboard_prediction->GetOrigin());
200 itk_outimage->SetSpacing(checkerboard_prediction->GetSpacing());
201 itk_outimage->Allocate();
202 itk_outimage->FillBuffer(0);
205 typedef itk::Size<3> SizeType;
208 itk::ShapedNeighborhoodIterator<TImageType> iit(size,checkerboard_prediction,checkerboard_prediction->GetLargestPossibleRegion());
209 itk::ShapedNeighborhoodIterator<TImageType> mit(size,itk_checkerboard_mask,itk_checkerboard_mask->GetLargestPossibleRegion());
210 itk::ImageRegionIterator<TImageType> oit(itk_outimage,itk_outimage->GetLargestPossibleRegion());
212 typedef typename itk::ShapedNeighborhoodIterator<TImageType>::OffsetType OffsetType;
216 iit.ActivateOffset(offset);
217 mit.ActivateOffset(offset);
219 iit.ActivateOffset(offset);
220 mit.ActivateOffset(offset);
221 offset[0] = 0; offset[1] = 1;
222 iit.ActivateOffset(offset);
223 mit.ActivateOffset(offset);
225 iit.ActivateOffset(offset);
226 mit.ActivateOffset(offset);
233 while(!iit.IsAtEnd())
235 if(mit.GetCenterPixel() == 0)
237 typename TImageType::PixelType mean = 0;
238 for (
auto i = iit.Begin(); ! i.IsAtEnd(); i++)
244 oit.Set((mean+0.5)/6.0);
248 oit.Set(iit.GetCenterPixel());
258 template<
typename TImageType >
261 typename TImageType::Pointer zeroimg = TImageType::New();
262 zeroimg->SetRegions(
image->GetLargestPossibleRegion());
263 zeroimg->SetDirection(
image->GetDirection());
264 zeroimg->SetOrigin(
image->GetOrigin());
265 zeroimg->SetSpacing(
image->GetSpacing());
268 zeroimg->FillBuffer(0);
270 typedef itk::CheckerBoardImageFilter<TImageType> FilterType;
271 typename FilterType::Pointer filter = FilterType::New();
272 filter->SetInput1(
image);
273 filter->SetInput2(zeroimg);
274 typename FilterType::PatternArrayType pattern;
275 pattern.SetElement(0,(
image->GetLargestPossibleRegion().GetSize()[0]));
276 pattern.SetElement(1,(
image->GetLargestPossibleRegion().GetSize()[1]));
277 pattern.SetElement(2,(
image->GetLargestPossibleRegion().GetSize()[2]));
278 filter->SetCheckerPattern(pattern);
285 template <
class TImageType>
286 void mitk::CLUtil::itkSumVoxelForLabel(TImageType*
image,
const mitk::Image::Pointer & source ,
typename TImageType::PixelType label,
double & val )
288 itk::Image<double,3>::Pointer itk_source;
291 itk::ImageRegionConstIterator<TImageType> inputIter(
image,
image->GetLargestPossibleRegion());
292 itk::ImageRegionConstIterator< itk::Image<double,3> > sourceIter(itk_source, itk_source->GetLargestPossibleRegion());
293 while(!inputIter.IsAtEnd())
295 if(inputIter.Value() == label) val += sourceIter.Value();
301 template <
class TImageType>
302 void mitk::CLUtil::itkSqSumVoxelForLabel(TImageType*
image,
const mitk::Image::Pointer & source,
typename TImageType::PixelType label,
double & val )
304 itk::Image<double,3>::Pointer itk_source;
307 itk::ImageRegionConstIterator<TImageType> inputIter(
image,
image->GetLargestPossibleRegion());
308 itk::ImageRegionConstIterator< itk::Image<double,3> > sourceIter(itk_source, itk_source->GetLargestPossibleRegion());
309 while(!inputIter.IsAtEnd())
311 if(inputIter.Value() == label) val += sourceIter.Value() * sourceIter.Value();
317 template<
typename TStructuringElement>
320 typename TStructuringElement::SizeType size;
326 size.SetElement(2,0);
329 size.SetElement(0,0);
332 size.SetElement(1,0);
336 se.CreateStructuringElement();
339 template<
typename TImageType>
342 typedef itk::BinaryBallStructuringElement<typename TImageType::PixelType, 3> BallType;
343 typedef itk::BinaryMorphologicalClosingImageFilter<TImageType, TImageType, BallType> FilterType;
346 itkFitStructuringElement(strElem,d,factor);
348 typename FilterType::Pointer erodeFilter = FilterType::New();
349 erodeFilter->SetKernel(strElem);
350 erodeFilter->SetInput(sourceImage);
351 erodeFilter->SetForegroundValue(1);
352 erodeFilter->Update();
358 template<
typename TImageType>
361 typedef itk::BinaryBallStructuringElement<typename TImageType::PixelType, 3> BallType;
362 typedef typename itk::BinaryDilateImageFilter<TImageType, TImageType, BallType> BallDilateFilterType;
365 itkFitStructuringElement(strElem,d,factor);
367 typename BallDilateFilterType::Pointer erodeFilter = BallDilateFilterType::New();
368 erodeFilter->SetKernel(strElem);
369 erodeFilter->SetInput(sourceImage);
370 erodeFilter->SetDilateValue(1);
371 erodeFilter->Update();
377 template<
typename TImageType>
380 typedef itk::BinaryBallStructuringElement<typename TImageType::PixelType, 3> BallType;
381 typedef typename itk::BinaryErodeImageFilter<TImageType, TImageType, BallType> BallErodeFilterType;
384 itkFitStructuringElement(strElem,d,factor);
387 typename BallErodeFilterType::Pointer erodeFilter = BallErodeFilterType::New();
388 erodeFilter->SetKernel(strElem);
389 erodeFilter->SetInput(sourceImage);
390 erodeFilter->SetErodeValue(1);
392 erodeFilter->Update();
403 template<
typename TPixel,
unsigned int VDimension>
404 void mitk::CLUtil::itkFillHolesBinary(itk::Image<TPixel, VDimension>* sourceImage,
mitk::Image::Pointer& resultImage)
406 typedef itk::Image<TPixel, VDimension>
ImageType;
407 typedef typename itk::BinaryFillholeImageFilter<ImageType> FillHoleFilterType;
409 typename FillHoleFilterType::Pointer fillHoleFilter = FillHoleFilterType::New();
410 fillHoleFilter->SetInput(sourceImage);
411 fillHoleFilter->SetForegroundValue(1);
412 fillHoleFilter->Update();
422 template<
typename TImageType>
426 typename TImageType::Pointer itk_outimage = TImageType::New();
427 itk_outimage->SetRegions(image1->GetLargestPossibleRegion());
428 itk_outimage->SetDirection(image1->GetDirection());
429 itk_outimage->SetOrigin(image1->GetOrigin());
430 itk_outimage->SetSpacing(image1->GetSpacing());
432 itk_outimage->Allocate();
433 itk_outimage->FillBuffer(0);
435 typename TImageType::Pointer itk_image2;
438 itk::ImageRegionConstIterator<TImageType> it1(image1, image1->GetLargestPossibleRegion());
439 itk::ImageRegionConstIterator<TImageType> it2(itk_image2, itk_image2->GetLargestPossibleRegion());
440 itk::ImageRegionIterator<TImageType> oit(itk_outimage,itk_outimage->GetLargestPossibleRegion());
442 while(!it1.IsAtEnd())
444 if(it1.Value() == 0 || it2.Value() == 0)
448 oit.Set(it1.Value());
463 template<
class TImageType>
466 typedef itk::DiscreteGaussianImageFilter<TImageType,TImageType> FilterType;
467 typename FilterType::Pointer filter = FilterType::New();
468 filter->SetInput(
image);
469 filter->SetVariance(sigma);
475 template<
class TImageType>
476 void mitk::CLUtil::itkDifferenceOfGaussianFilter(TImageType *
image,
mitk::Image::Pointer & smoothed,
double sigma1,
double sigma2)
478 typedef itk::DiscreteGaussianImageFilter<TImageType, TImageType> FilterType;
479 typedef itk::SubtractImageFilter <TImageType, TImageType> SubtractFilterType;
480 typename FilterType::Pointer filter1 = FilterType::New();
481 typename FilterType::Pointer filter2 = FilterType::New();
482 typename SubtractFilterType::Pointer subFilter = SubtractFilterType::New();
483 filter1->SetInput(
image);
484 filter1->SetVariance(sigma1);
486 filter2->SetInput(
image);
487 filter2->SetVariance(sigma2);
489 subFilter->SetInput1(filter1->GetOutput());
490 subFilter->SetInput2(filter2->GetOutput());
497 template<
typename TPixel,
unsigned int VImageDimension>
498 void mitk::CLUtil::itkLaplacianOfGaussianFilter(itk::Image<TPixel, VImageDimension>* itkImage,
double variance,
mitk::Image::Pointer &output)
500 typedef itk::Image<TPixel, VImageDimension>
ImageType;
501 typedef itk::DiscreteGaussianImageFilter< ImageType, ImageType > GaussFilterType;
502 typedef itk::LaplacianRecursiveGaussianImageFilter<ImageType, ImageType> LaplacianFilter;
504 typename GaussFilterType::Pointer gaussianFilter = GaussFilterType::New();
505 gaussianFilter->SetInput(itkImage);
506 gaussianFilter->SetVariance(variance);
507 gaussianFilter->Update();
508 typename LaplacianFilter::Pointer laplaceFilter = LaplacianFilter::New();
509 laplaceFilter->SetInput(gaussianFilter->GetOutput());
510 laplaceFilter->Update();
516 template <
class TInput,
class TOutput>
517 class MatrixFirstEigenvalue
520 MatrixFirstEigenvalue() {}
521 virtual ~MatrixFirstEigenvalue() {}
525 inline TOutput operator ()(
const TInput& input)
528 if (input[0] < 0.01 && input[1] < 0.01 &&input[2] < 0.01 &&input[3] < 0.01 &&input[4] < 0.01 &&input[5] < 0.01)
530 vnl_symmetric_eigensystem_compute_eigenvals(input[0], input[1], input[2], input[3], input[4], input[5], a, b, c);
539 bool operator !=(
const MatrixFirstEigenvalue)
const 543 bool operator ==(
const MatrixFirstEigenvalue& other)
const 545 return !(*
this != other);
550 template<
typename TPixel,
unsigned int VImageDimension>
551 void mitk::CLUtil::itkHessianOfGaussianFilter(itk::Image<TPixel, VImageDimension>* itkImage,
double variance, std::vector<mitk::Image::Pointer> &out)
553 typedef itk::Image<TPixel, VImageDimension>
ImageType;
555 typedef itk::HessianRecursiveGaussianImageFilter <ImageType> HessianFilterType;
556 typedef typename HessianFilterType::OutputImageType VectorImageType;
557 typedef Functor::MatrixFirstEigenvalue<typename VectorImageType::PixelType, double> DeterminantFunctorType;
558 typedef itk::UnaryFunctorImageFilter<VectorImageType, FloatImageType, DeterminantFunctorType> DetFilterType;
560 typename HessianFilterType::Pointer hessianFilter = HessianFilterType::New();
561 hessianFilter->SetInput(itkImage);
562 hessianFilter->SetSigma(std::sqrt(variance));
563 for (
unsigned int i = 0; i < VImageDimension; ++i)
566 typename DetFilterType::Pointer detFilter = DetFilterType::New();
567 detFilter->SetInput(hessianFilter->GetOutput());
568 detFilter->GetFunctor().order = i;
571 out.push_back(tmpImage);
575 template<
typename TPixel,
unsigned int VImageDimension>
576 void mitk::CLUtil::itkLocalHistograms(itk::Image<TPixel, VImageDimension>* itkImage, std::vector<mitk::Image::Pointer> &out,
int size,
int bins)
578 typedef itk::Image<TPixel, VImageDimension>
ImageType;
581 typename MultiHistogramType::Pointer filter = MultiHistogramType::New();
582 filter->SetInput(itkImage);
583 filter->SetUseImageIntensityRange(
true);
584 filter->SetSize(size);
585 filter->SetBins(bins);
587 for (
int i = 0; i < bins; ++i)
595 template<
class TImageType>
598 typedef itk::BinaryBallStructuringElement<typename TImageType::PixelType, 3> StructureElementType;
599 typedef itk::GrayscaleErodeImageFilter<TImageType,TImageType,StructureElementType> FilterType;
601 StructureElementType ball;
602 itkFitStructuringElement(ball,d, radius);
604 typename FilterType::Pointer filter = FilterType::New();
605 filter->SetKernel(ball);
606 filter->SetInput(
image);
612 template<
class TImageType>
615 typedef itk::BinaryBallStructuringElement<typename TImageType::PixelType, 3> StructureElementType;
616 typedef itk::GrayscaleDilateImageFilter<TImageType,TImageType,StructureElementType> FilterType;
618 StructureElementType ball;
619 itkFitStructuringElement(ball,d, radius);
621 typename FilterType::Pointer filter = FilterType::New();
622 filter->SetKernel(ball);
623 filter->SetInput(
image);
629 template<
class TImageType>
632 typedef itk::GrayscaleFillholeImageFilter<TImageType,TImageType> FilterType;
634 typename FilterType::Pointer filter = FilterType::New();
635 filter->SetInput(
image);
static void ConnectedComponentsImage(mitk::Image::Pointer &image, mitk::Image::Pointer &mask, mitk::Image::Pointer &outimage, unsigned int &num_components)
ConnectedComponentsImage.
#define AccessByItk_3(mitkImage, itkImageTypeFunction, arg1, arg2, arg3)
static void LogicalAndImages(const Image::Pointer &image1, const Image::Pointer &image2, Image::Pointer &outimage)
LogicalAndImages.
MITKCORE_EXPORT bool operator!=(const InteractionEvent &a, const InteractionEvent &b)
MorphologicalDimensions
The MorphologicalDimensions enum.
static void LocalHistogram(mitk::Image::Pointer image, std::vector< mitk::Image::Pointer > &out, int Bins, int NeighbourhoodSize)
Local Histogram.
static void GrabLabel(mitk::Image::Pointer &image, mitk::Image::Pointer &outimage, unsigned int label)
GrabLabel.
itk::Image< unsigned char, 3 > ImageType
static void ErodeBinary(mitk::Image::Pointer &sourceImage, mitk::Image::Pointer &resultImage, int radius, MorphologicalDimensions d)
ErodeBinary.
static void HessianOfGaussianFilter(mitk::Image::Pointer image, std::vector< mitk::Image::Pointer > &out, double sigma)
SubtractGaussianFilter.
itk::Image< double, 3 > FloatImageType
static void GaussianFilter(mitk::Image::Pointer image, mitk::Image::Pointer &smoothed, double sigma)
GaussianFilter.
#define AccessByItk_1(mitkImage, itkImageTypeFunction, arg1)
MITKCORE_EXPORT bool operator==(const InteractionEvent &a, const InteractionEvent &b)
#define AccessFixedDimensionByItk_3(mitkImage, itkImageTypeFunction, dimension, arg1, arg2, arg3)
static void DifferenceOfGaussianFilter(mitk::Image::Pointer image, mitk::Image::Pointer &smoothed, double sigma1, double sigma2)
SubtractGaussianFilter.
static void DilateGrayscale(mitk::Image::Pointer &image, unsigned int radius, mitk::CLUtil::MorphologicalDimensions d, mitk::Image::Pointer &outimage)
DilateGrayscale.
static void FillHoleGrayscale(mitk::Image::Pointer &image, mitk::Image::Pointer &outimage)
FillHoleGrayscale.
static void DilateBinary(mitk::Image::Pointer &sourceImage, mitk::Image::Pointer &resultImage, int radius, MorphologicalDimensions d)
DilateBinary.
static void ErodeGrayscale(mitk::Image::Pointer &image, unsigned int radius, mitk::CLUtil::MorphologicalDimensions d, mitk::Image::Pointer &outimage)
ErodeGrayscale.
static void InterpolateCheckerboardPrediction(mitk::Image::Pointer checkerboard_prediction, mitk::Image::Pointer &checkerboard_mask, mitk::Image::Pointer &outimage)
InterpolateCreateCheckerboardPrediction.
#define AccessFixedDimensionByItk_2(mitkImage, itkImageTypeFunction, dimension, arg1, arg2)
static void InsertLabel(mitk::Image::Pointer &image, mitk::Image::Pointer &maskImage, unsigned int label)
itkInsertLabel
static void LaplacianOfGaussianFilter(mitk::Image::Pointer image, mitk::Image::Pointer &smoothed, double sigma1)
Laplacian of Gaussian.
static void ProbabilityMap(const mitk::Image::Pointer &sourceImage, double mean, double std_dev, mitk::Image::Pointer &resultImage)
ProbabilityMap.
static void itkCountVoxel(TImageType *image, std::map< unsigned int, unsigned int > &map)
mitk::Image::Pointer image
#define AccessFixedDimensionByItk_1(mitkImage, itkImageTypeFunction, dimension, arg1)
void CastToMitkImage(const itk::SmartPointer< ItkOutputImageType > &itkimage, itk::SmartPointer< mitk::Image > &mitkoutputimage)
Cast an itk::Image (with a specific type) to an mitk::Image.
void MITKCORE_EXPORT CastToItkImage(const mitk::Image *mitkImage, itk::SmartPointer< ItkOutputImageType > &itkOutputImage)
Cast an mitk::Image to an itk::Image with a specific type.
static void ClosingBinary(mitk::Image::Pointer &sourceImage, mitk::Image::Pointer &resultImage, int radius, MorphologicalDimensions d)
ClosingBinary.
static void MergeLabels(mitk::Image::Pointer &img, const std::map< unsigned int, unsigned int > &map)
MergeLabels.
mitk::Image::Pointer mask
#define AccessByItk_2(mitkImage, itkImageTypeFunction, arg1, arg2)
static void CreateCheckerboardMask(mitk::Image::Pointer image, mitk::Image::Pointer &outimage)
CreateCheckerBoardPredictionMask.
static void CountVoxel(mitk::Image::Pointer image, std::map< unsigned int, unsigned int > &map)
CountVoxel.