25 #include "itkImageRegionConstIterator.h" 26 #include "itkImageRegionConstIteratorWithIndex.h" 27 #include "itkImageRegionIterator.h" 29 #include "itkHistogramMatchingImageFilter.h" 30 #include "itkAdaptiveHistogramEqualizationImageFilter.h" 32 #include "itkConnectedThresholdImageFilter.h" 33 #include "itkOrientImageFilter.h" 34 #include "itkResampleImageFilter.h" 35 #include "itkIdentityTransform.h" 43 #include "itkLinearInterpolateImageFunction.h" 44 #include "itkBSplineInterpolateImageFunction.h" 45 #include "itkNearestNeighborInterpolateImageFunction.h" 48 #include "itkTestingComparisonImageFilter.h" 50 #include "itkStripTsImageFilter.h" 51 #include "itkMaskImageFilter.h" 57 #include "gdcmReader.h" 59 #include "DicomIOManager.h" 61 using ImageTypeFloat3D = itk::Image< float, 3 >;
67 Demons, DiffeomorphicDemons, SymmetricForcesDemons, FastSymmetricForcesDemons
72 Linear, NearestNeighbor, BSpline
87 template<
class TImageType = ImageTypeFloat3D >
88 std::vector< std::vector< typename TImageType::IndexType > >
CreateMaskIndeces(
const std::vector< std::vector< typename TImageType::Pointer > > &inputModalitiesAndImages)
90 std::vector< std::vector< typename TImageType::IndexType > > returnMaskIndeces;
91 returnMaskIndeces.resize(inputModalitiesAndImages.size());
95 int threads = omp_get_max_threads();
98 for (
int i = 0; i < inputModalitiesAndImages.size(); i++)
100 std::vector< float > means;
101 std::vector< typename TImageType::IndexType > tempIndeces;
102 typename TImageType::SizeType size = inputModalitiesAndImages[i][0]->GetLargestPossibleRegion().GetSize();
103 size_t totalImageSize = size[0] * size[1] * size[2];
104 means.resize(totalImageSize);
106 means.assign(totalImageSize, 0);
108 for (
size_t j = 0; j < inputModalitiesAndImages[i].size(); j++)
110 std::vector< float > tempVec;
111 itk::ImageRegionIterator< TImageType > it(inputModalitiesAndImages[i][j], inputModalitiesAndImages[i][j]->GetLargestPossibleRegion());
114 while (!it.IsAtEnd())
116 tempVec.push_back(it.Get());
117 tempIndeces.push_back(it.GetIndex());
120 if (tempVec.size() == means.size())
122 std::transform(means.begin(), means.end(), tempVec.begin(), means.begin(), std::plus< float >());
126 std::cerr <<
"Mean vector calculation error.\n";
132 std::vector< typename TImageType::IndexType > tempMaskIndeces;
133 for (
size_t j = 0; j < means.size(); j++)
137 tempMaskIndeces.push_back(tempIndeces[j]);
140 returnMaskIndeces[i] = tempMaskIndeces;
143 return returnMaskIndeces;
153 template <
typename TImageType = ImageTypeFloat3D >
154 std::vector< typename TImageType::PixelType >
GetPixelValuesFromIndeces(
const typename TImageType::Pointer inputImage,
const std::vector< typename TImageType::IndexType > &indeces)
156 std::vector< typename TImageType::PixelType > returnVector;
157 returnVector.resize(indeces.size());
159 typedef itk::ImageRegionIterator< TImageType > IteratorType;
160 IteratorType imageIterator(inputImage, inputImage->GetBufferedRegion());
163 int threads = omp_get_max_threads();
166 for (
int i = 0; i < returnVector.size(); i++)
168 imageIterator.SetIndex(indeces[i]);
169 returnVector[i] = imageIterator.Get();
178 template <
typename TImageType = ImageTypeFloat3D >
179 std::vector< typename TImageType::PixelType >
ExtractPixelValuesFromIndeces(
const typename TImageType::Pointer inputImage,
const std::vector< typename TImageType::IndexType > &indeces)
181 return GetPixelValuesFromIndeces< TImageType >(inputImage, indeces);
209 template <
typename TImageType = ImageTypeFloat3D >
210 std::vector< typename TImageType::IndexType >
GetIndexFromNonZeroPixels(
const typename TImageType::Pointer inputImage,
const std::string valuesToExclude =
"0")
212 std::vector< typename TImageType::IndexType > returnVector;
214 itk::ImageRegionConstIterator< TImageType > iterator(inputImage, inputImage->GetLargestPossibleRegion());
215 for (iterator.GoToBegin(); !iterator.IsAtEnd(); ++iterator)
217 if (iterator.Get() != 0)
219 returnVector.push_back(iterator.GetIndex());
234 template <
typename TImageType = ImageTypeFloat3D >
235 typename TImageType::Pointer
GetHistogramMatchedImage(
const typename TImageType::Pointer inputImage,
const typename TImageType::Pointer referenceImage,
236 const int numberOfMatchPoints = 40,
const int numberOfHistogramLevels = 100)
238 auto filter = itk::HistogramMatchingImageFilter< TImageType, TImageType >::New();
239 filter->SetInput(inputImage);
240 filter->SetReferenceImage(referenceImage);
241 if (numberOfHistogramLevels != 100)
243 filter->SetNumberOfHistogramLevels(numberOfHistogramLevels);
245 filter->ThresholdAtMeanIntensityOn();
246 filter->SetNumberOfMatchPoints(numberOfMatchPoints);
249 return filter->GetOutput();
261 template <
typename TImageType = ImageTypeFloat3D >
263 const float alpha = 0.3,
const float beta = 0.3,
const float radius = 1,
const int numberOfHistogramLevels = 100)
265 auto filter = itk::AdaptiveHistogramEqualizationImageFilter< TImageType, TImageType >::New();
266 filter->SetInput(inputImage);
267 filter->SetAlpha(alpha);
268 filter->SetBeta(beta);
269 filter->SetRadius(radius);
272 return filter->GetOutput();
288 template<
class TImageType = ImageTypeFloat3D >
290 const typename TImageType::PixelType differenceThreshold = 0,
const unsigned int toleranceRadius = 0,
291 const unsigned long long numberOfPixelsTolerance = 10,
const typename TImageType::PixelType averageIntensityDifference = 0)
294 if (referenceImage->GetLargestPossibleRegion().GetSize() != checkImage->GetLargestPossibleRegion().GetSize())
300 auto diff = itk::Testing::ComparisonImageFilter< TImageType, TImageType >::New();
301 diff->SetValidInput(referenceImage);
302 diff->SetTestInput(checkImage);
303 diff->SetDifferenceThreshold(differenceThreshold);
304 diff->SetToleranceRadius(toleranceRadius);
305 diff->UpdateLargestPossibleRegion();
308 if (static_cast<typename TImageType::PixelType>(diff->GetTotalDifference()) > averageIntensityDifference)
311 if (diff->GetNumberOfPixelsWithDifferences() > numberOfPixelsTolerance)
323 template<
typename TImageType >
324 inline bool ImageSanityCheck(
const typename TImageType::Pointer image1,
const typename TImageType::Pointer image2)
326 auto size_1 = image1->GetLargestPossibleRegion().GetSize();
327 auto size_2 = image2->GetLargestPossibleRegion().GetSize();
329 auto origin_1 = image1->GetOrigin();
330 auto origin_2 = image2->GetOrigin();
332 auto spacing_1 = image1->GetSpacing();
333 auto spacing_2 = image2->GetSpacing();
335 for (
size_t i = 0; i < TImageType::ImageDimension; i++)
337 if (size_1[i] != size_2[i])
339 std::cerr <<
"Size mismatch at dimension '" << i <<
"'\n";
342 if (origin_1[i] != origin_2[i])
344 std::cerr <<
"Origin mismatch at dimension '" << i <<
"'\n";
347 if (spacing_1[i] != spacing_2[i])
349 std::cerr <<
"Spacing mismatch at dimension '" << i <<
"'\n";
367 if (imageInfo1.GetImageDimensions() != imageInfo2.GetImageDimensions())
369 std::cout <<
"The dimensions of the image_1 (" << image1 <<
") and image_2 (" << image2 <<
") doesn't match.\n";
374 auto dims = imageInfo1.GetImageDimensions();
376 auto imageSize1 = imageInfo1.GetImageSize();
377 auto imageSize2 = imageInfo2.GetImageSize();
379 auto imageSpacing1 = imageInfo1.GetImageSpacings();
380 auto imageSpacing2 = imageInfo2.GetImageSpacings();
382 auto imageOrigin1 = imageInfo1.GetImageOrigins();
383 auto imageOrigin2 = imageInfo2.GetImageOrigins();
385 for (
size_t d = 0; d < dims; d++)
387 if (imageSize1[d] != imageSize2[d])
389 std::cout <<
"The size in dimension[" << d <<
"] of the image_1 (" << image1 <<
") and image_2 (" << image2 <<
") doesn't match.\n";
392 if (imageSpacing1[d] != imageSpacing2[d])
394 std::cout <<
"The spacing in dimension[" << d <<
"] of the image_1 (" << image1 <<
") and image_2 (" << image2 <<
") doesn't match.\n";
397 if (imageOrigin1[d] != imageOrigin2[d])
399 std::cout <<
"The origin in dimension[" << d <<
"] of the image_1 (" << image1 <<
") and image_2 (" << image2 <<
") doesn't match.\n";
543 template<
class TImageType = ImageTypeFloat3D >
544 std::pair< std::string, typename TImageType::Pointer >
GetImageOrientation(
const typename TImageType::Pointer inputImage)
546 using namespace itk::SpatialOrientation;
547 auto orientFilter = itk::OrientImageFilter< TImageType, TImageType >::New();
548 orientFilter->SetInput(inputImage);
549 orientFilter->SetDesiredCoordinateOrientation(ITK_COORDINATE_ORIENTATION_RAI);
550 orientFilter->Update();
552 std::string returnString;
554 switch (orientFilter->GetGivenCoordinateOrientation())
556 case ITK_COORDINATE_ORIENTATION_RIP:
558 returnString =
"RIP";
561 case ITK_COORDINATE_ORIENTATION_LIP:
563 returnString =
"LIP";
566 case ITK_COORDINATE_ORIENTATION_RSP:
568 returnString =
"RSP";
571 case ITK_COORDINATE_ORIENTATION_LSP:
573 returnString =
"LSP";
576 case ITK_COORDINATE_ORIENTATION_RIA:
578 returnString =
"RIA";
581 case ITK_COORDINATE_ORIENTATION_LIA:
583 returnString =
"LIA";
586 case ITK_COORDINATE_ORIENTATION_LSA:
588 returnString =
"LSA";
591 case ITK_COORDINATE_ORIENTATION_IRP:
593 returnString =
"IRP";
596 case ITK_COORDINATE_ORIENTATION_ILP:
598 returnString =
"ILP";
601 case ITK_COORDINATE_ORIENTATION_SRP:
603 returnString =
"SRP";
606 case ITK_COORDINATE_ORIENTATION_SLP:
608 returnString =
"SLP";
611 case ITK_COORDINATE_ORIENTATION_IRA:
613 returnString =
"IRA";
616 case ITK_COORDINATE_ORIENTATION_ILA:
618 returnString =
"ILA";
621 case ITK_COORDINATE_ORIENTATION_SRA:
623 returnString =
"SRA";
626 case ITK_COORDINATE_ORIENTATION_SLA:
628 returnString =
"SLA";
631 case ITK_COORDINATE_ORIENTATION_RPI:
633 returnString =
"RPI";
636 case ITK_COORDINATE_ORIENTATION_LPI:
638 returnString =
"LPI";
641 case ITK_COORDINATE_ORIENTATION_RAI:
643 returnString =
"RAI";
646 case ITK_COORDINATE_ORIENTATION_LAI:
648 returnString =
"LAI";
651 case ITK_COORDINATE_ORIENTATION_RPS:
653 returnString =
"RPS";
656 case ITK_COORDINATE_ORIENTATION_LPS:
658 returnString =
"LPS";
661 case ITK_COORDINATE_ORIENTATION_RAS:
663 returnString =
"RAS";
666 case ITK_COORDINATE_ORIENTATION_LAS:
668 returnString =
"LAS";
671 case ITK_COORDINATE_ORIENTATION_PRI:
673 returnString =
"PRI";
676 case ITK_COORDINATE_ORIENTATION_PLI:
678 returnString =
"PLI";
681 case ITK_COORDINATE_ORIENTATION_ARI:
683 returnString =
"ARI";
686 case ITK_COORDINATE_ORIENTATION_ALI:
688 returnString =
"ALI";
691 case ITK_COORDINATE_ORIENTATION_PRS:
693 returnString =
"PRS";
696 case ITK_COORDINATE_ORIENTATION_PLS:
698 returnString =
"PLS";
701 case ITK_COORDINATE_ORIENTATION_ARS:
703 returnString =
"ARS";
706 case ITK_COORDINATE_ORIENTATION_ALS:
708 returnString =
"ALS";
711 case ITK_COORDINATE_ORIENTATION_IPR:
713 returnString =
"IPR";
716 case ITK_COORDINATE_ORIENTATION_SPR:
718 returnString =
"SPR";
721 case ITK_COORDINATE_ORIENTATION_IAR:
723 returnString =
"IAR";
726 case ITK_COORDINATE_ORIENTATION_SAR:
728 returnString =
"SAR";
731 case ITK_COORDINATE_ORIENTATION_IPL:
733 returnString =
"IPL";
736 case ITK_COORDINATE_ORIENTATION_SPL:
738 returnString =
"SPL";
741 case ITK_COORDINATE_ORIENTATION_IAL:
743 returnString =
"IAL";
746 case ITK_COORDINATE_ORIENTATION_SAL:
748 returnString =
"SAL";
751 case ITK_COORDINATE_ORIENTATION_PIR:
753 returnString =
"PIR";
756 case ITK_COORDINATE_ORIENTATION_PSR:
758 returnString =
"PSR";
761 case ITK_COORDINATE_ORIENTATION_AIR:
763 returnString =
"AIR";
766 case ITK_COORDINATE_ORIENTATION_ASR:
768 returnString =
"ASR";
771 case ITK_COORDINATE_ORIENTATION_PIL:
773 returnString =
"PIL";
776 case ITK_COORDINATE_ORIENTATION_PSL:
778 returnString =
"PSL";
781 case ITK_COORDINATE_ORIENTATION_AIL:
783 returnString =
"AIL";
786 case ITK_COORDINATE_ORIENTATION_ASL:
788 returnString =
"ASL";
793 returnString =
"UNKNOWN";
798 return std::make_pair(returnString, orientFilter->GetOutput());
810 template<
class TImageType = ImageTypeFloat3D,
class TAtlasImageType = TImageType,
class TAtlasLabelType = TImageType >
812 const typename TAtlasImageType::Pointer atlasImage,
const typename TAtlasLabelType::Pointer atlasLabelImage)
815 auto skullStripper = itk::StripTsImageFilter< TImageType, TAtlasImageType, TAtlasLabelType>::New();
816 skullStripper->SetInput(inputImage);
817 skullStripper->SetAtlasImage(atlasImage);
818 skullStripper->SetAtlasBrainMask(atlasLabelImage);
823 skullStripper->Update();
825 catch (itk::ExceptionObject &exception)
827 std::cerr <<
"Exception caught: " << exception <<
"\n";
832 auto masker = itk::MaskImageFilter< TImageType, TAtlasLabelType, TImageType >::New();
833 masker->SetInput(inputImage);
834 masker->SetMaskImage(skullStripper->GetOutput());
840 catch (itk::ExceptionObject &exception)
842 std::cerr <<
"Exception caught: " << exception <<
"\n";
846 return masker->GetOutput();
852 template<
class TImageType = ImageTypeFloat3D >
855 float currentDist = 0.0;
856 for (
size_t i = 0; i < TImageType::ImageDimension; i++)
858 currentDist += powf(point1[i] - point2[i], 2);
860 currentDist = sqrtf(currentDist);
870 float currentDist = 0.0;
871 for (
size_t i = 0; i < 3; i++)
873 currentDist += powf(point1[i] - point2[i], 2);
875 currentDist = sqrtf(currentDist);
889 template<
class TImageType = ImageTypeFloat3D >
891 const typename TImageType::IndexType indexForComputation,
892 bool realCoordinateInput =
false,
bool realCoordinateOutput =
false)
894 auto indexToUse = indexForComputation;
895 if (realCoordinateInput)
897 for (
size_t i = 0; i < TImageType::ImageDimension; i++)
900 indexToUse[i] = std::abs((indexToUse[i] * inputLabelMap->GetSpacing()[i]) + inputLabelMap->GetOrigin()[i]);
904 auto connectedComponentFilter = itk::ConnectedThresholdImageFilter< TImageType, TImageType >::New();
905 connectedComponentFilter->SetInput(inputLabelMap);
906 connectedComponentFilter->SetSeed(indexToUse);
907 connectedComponentFilter->SetReplaceValue(1);
909 auto currentPixelVal = inputLabelMap->GetPixel(indexToUse);
910 connectedComponentFilter->SetLower(currentPixelVal);
911 connectedComponentFilter->SetUpper(currentPixelVal);
912 connectedComponentFilter->Update();
914 itk::ImageRegionConstIterator <TImageType> iterator(connectedComponentFilter->GetOutput(), connectedComponentFilter->GetOutput()->GetLargestPossibleRegion());
917 typename TImageType::IndexType index_maxDist;
920 for (iterator.GoToBegin(); !iterator.IsAtEnd(); ++iterator)
922 if (iterator.Get() > 0)
924 auto currentIndex = iterator.GetIndex();
925 float currentDist = 0.0;
926 currentDist = GetDistanceBetweenIndeces<TImageType>(currentIndex, indexToUse);
928 if (currentDist > maxDist)
930 maxDist = currentDist;
931 index_maxDist = currentIndex;
936 if (realCoordinateOutput)
938 for (
size_t i = 0; i < TImageType::ImageDimension; i++)
941 index_maxDist[i] = (index_maxDist[i] * inputLabelMap->GetSpacing()[i]) + inputLabelMap->GetOrigin()[i];
945 return std::make_pair(maxDist, index_maxDist);
954 template<
class TImageType = ImageTypeFloat3D >
955 typename TImageType::Pointer
CreateImage(
const typename TImageType::Pointer inputImage,
const typename TImageType::PixelType value = 0)
957 typename TImageType::Pointer new_image = TImageType::New();
958 new_image->SetLargestPossibleRegion(inputImage->GetLargestPossibleRegion());
959 new_image->SetRequestedRegion(inputImage->GetRequestedRegion());
960 new_image->SetBufferedRegion(inputImage->GetBufferedRegion());
961 new_image->SetDirection(inputImage->GetDirection());
962 new_image->SetOrigin(inputImage->GetOrigin());
963 new_image->SetSpacing(inputImage->GetSpacing());
964 new_image->Allocate();
965 new_image->FillBuffer(value);
976 template<
class TImageType = ImageTypeFloat3D >
977 typename TImageType::Pointer
ChangeImageValues(
const typename TImageType::Pointer inputImage,
const std::string &oldValues,
const std::string &newValues)
981 if (oldValues_split.size() != newValues_split.size())
983 std::cerr <<
"Change values needs the old and new values to be of same size, for example '-cv 1x2,2x3.\n";
987 itk::ImageRegionConstIterator< TImageType > iterator(inputImage, inputImage->GetBufferedRegion());
988 auto outputImage = inputImage;
989 outputImage->DisconnectPipeline();
990 itk::ImageRegionIterator< TImageType > outputIterator(outputImage, outputImage->GetBufferedRegion());
991 outputIterator.GoToBegin();
992 for (iterator.GoToBegin(); !iterator.IsAtEnd(); ++iterator, ++outputIterator)
994 for (
size_t i = 0; i < oldValues_split.size(); i++)
996 if (iterator.Get() == std::atof(oldValues_split[i].c_str()))
998 outputIterator.Set(std::atof(newValues_split[i].c_str()));
1011 template<
typename TImageType = ImageTypeFloat3D >
1012 itk::Vector< float, TImageType::ImageDimension >
GetDistances(
const typename TImageType::Pointer inputImage)
1014 itk::Vector< float, TImageType::ImageDimension > distances;
1015 itk::Point< float, TImageType::ImageDimension > start_worldCoordinates, end_worldCoordinates;
1017 typename TImageType::IndexType start_image, end_image;
1019 auto size = inputImage->GetBufferedRegion().GetSize();
1021 for (
size_t i = 0; i < TImageType::ImageDimension; i++)
1024 end_image[i] = size[i] - 1;
1027 inputImage->TransformIndexToPhysicalPoint(start_image, start_worldCoordinates);
1028 inputImage->TransformIndexToPhysicalPoint(end_image, end_worldCoordinates);
1030 for (
size_t i = 0; i < TImageType::ImageDimension; i++)
1032 distances[i] = std::abs(end_worldCoordinates[i] - start_worldCoordinates[i]);
1047 template<
class TImageType = ImageTypeFloat3D >
1048 typename TImageType::Pointer
ResampleImage(
const typename TImageType::Pointer inputImage,
const itk::Vector< double, TImageType::ImageDimension > &outputSpacing,
const std::string interpolator =
"Linear")
1050 auto outputSize = inputImage->GetLargestPossibleRegion().GetSize();
1051 auto outputSpacingVector = outputSpacing;
1052 auto inputSpacing = inputImage->GetSpacing();
1053 if (TImageType::ImageDimension != 4)
1055 for (
size_t i = 0; i < TImageType::ImageDimension; i++)
1057 outputSize[i] = std::round(outputSize[i] * inputSpacing[i] / outputSpacing[i]);
1062 for (
size_t i = 0; i < 3; i++)
1064 outputSize[i] = std::round(outputSize[i] * inputSpacing[i] / outputSpacing[i]);
1068 return ResampleImage< TImageType >(inputImage, outputSpacingVector, outputSize, interpolator);
1081 template<
class TImageType = ImageTypeFloat3D >
1082 typename TImageType::Pointer
ResampleImage(
const typename TImageType::Pointer inputImage,
const typename TImageType::SpacingType outputSpacing,
1083 typename TImageType::SizeType outputSize,
const std::string interpolator =
"Linear")
1085 std::string interpolator_wrap = interpolator;
1086 std::transform(interpolator_wrap.begin(), interpolator_wrap.end(), interpolator_wrap.begin(), ::tolower);
1088 auto resampler = itk::ResampleImageFilter< TImageType, TImageType >::New();
1089 resampler->SetInput(inputImage);
1090 resampler->SetSize(outputSize);
1091 resampler->SetOutputSpacing(outputSpacing);
1092 resampler->SetOutputOrigin(inputImage->GetOrigin());
1093 resampler->SetOutputDirection(inputImage->GetDirection());
1094 resampler->SetOutputStartIndex(inputImage->GetLargestPossibleRegion().GetIndex());
1095 resampler->SetTransform(itk::IdentityTransform< double, TImageType::ImageDimension >::New());
1096 if (interpolator_wrap ==
"bspline")
1098 auto interpolatorFunc = itk::BSplineInterpolateImageFunction< TImageType, double >::New();
1099 resampler->SetInterpolator(interpolatorFunc);
1101 else if (interpolator_wrap.find(
"bicubic") != std::string::npos)
1103 auto interpolatorFunc = itk::BSplineInterpolateImageFunction< TImageType >::New();
1104 interpolatorFunc->SetSplineOrder(3);
1105 resampler->SetInterpolator(interpolatorFunc);
1107 else if (interpolator_wrap.find(
"nearest") != std::string::npos)
1109 auto interpolatorFunc = itk::NearestNeighborInterpolateImageFunction< TImageType, double >::New();
1110 resampler->SetInterpolator(interpolatorFunc);
1124 auto interpolatorFunc = itk::LinearInterpolateImageFunction< TImageType, double >::New();
1125 resampler->SetInterpolator(interpolatorFunc);
1127 resampler->UpdateLargestPossibleRegion();
1129 return resampler->GetOutput();
1141 template<
class TImageType = ImageTypeFloat3D >
1142 typename TImageType::Pointer
ResampleImage(
const typename TImageType::Pointer inputImage,
const float outputSpacing = 1.0,
const std::string interpolator =
"Linear")
1144 auto outputSize = inputImage->GetLargestPossibleRegion().GetSize();
1145 auto inputSpacing = inputImage->GetSpacing();
1146 auto outputSpacingVector = inputSpacing;
1147 if (TImageType::ImageDimension != 4)
1149 outputSpacingVector.Fill(outputSpacing);
1150 for (
size_t i = 0; i < TImageType::ImageDimension; i++)
1152 outputSize[i] = std::round(outputSize[i] * inputSpacing[i] / outputSpacing);
1157 for (
size_t i = 0; i < 3; i++)
1159 outputSpacingVector[i] = outputSpacing;
1160 outputSize[i] = std::round(outputSize[i] * inputSpacing[i] / outputSpacing);
1162 outputSpacingVector[3] = inputSpacing[3];
1165 return ResampleImage< TImageType >(inputImage, outputSpacingVector, outputSize, interpolator);
1178 template<
class TImageType = ImageTypeFloat3D >
1179 typename TImageType::Pointer
ResizeImage(
const typename TImageType::Pointer inputImage,
const size_t resizeFactor,
const std::string &interpolator =
"Linear")
1181 const float factor = static_cast<float>(resizeFactor) / 100;
1182 auto outputSize = inputImage->GetLargestPossibleRegion().GetSize();
1183 auto outputSpacing = inputImage->GetSpacing();
1184 if (TImageType::ImageDimension != 4)
1186 for (
size_t i = 0; i < TImageType::ImageDimension; i++)
1188 outputSize[i] = outputSize[i] * factor;
1189 outputSpacing[i] = outputSpacing[i] / factor;
1194 for (
size_t i = 0; i < 3; i++)
1196 outputSize[i] = outputSize[i] * factor;
1197 outputSpacing[i] = outputSpacing[i] / factor;
1201 return ResampleImage < TImageType >(inputImage, outputSpacing, outputSize, interpolator);
1211 template<
class TImageType = ImageTypeFloat3D >
1212 std::vector< typename TImageType::PixelType >
GetUniqueValuesInImage(
typename TImageType::Pointer inputImage,
bool sortResult =
true)
1214 itk::ImageRegionConstIterator< TImageType > iterator(inputImage, inputImage->GetBufferedRegion());
1216 std::vector< typename TImageType::PixelType > uniqueValues;
1218 for (iterator.GoToBegin(); !iterator.IsAtEnd(); ++iterator)
1220 auto currentValue = iterator.Get();
1221 if (std::find(uniqueValues.begin(), uniqueValues.end(), currentValue) == uniqueValues.end())
1223 uniqueValues.push_back(currentValue);
1229 std::sort(uniqueValues.begin(), uniqueValues.end(), std::less< typename TImageType::PixelType >());
1232 return uniqueValues;
1238 template<
class TImageType = ImageTypeFloat3D >
1239 std::vector< typename TImageType::IndexType >
GetNonZeroIndeces(
typename TImageType::Pointer inputImage)
1241 std::vector< typename TImageType::IndexType > outputIndeces;
1242 itk::ImageRegionConstIterator< TImageType > iterator(inputImage, inputImage->GetBufferedRegion());
1244 for (iterator.GoToBegin(); !iterator.IsAtEnd(); ++iterator)
1246 if (iterator.Get() != 0)
1248 outputIndeces.push_back(iterator.GetIndex());
1251 return outputIndeces;
std::vector< typename TImageType::IndexType > GetNonZeroIndeces(typename TImageType::Pointer inputImage)
Get Non-zero indeces of image.
Definition: cbicaITKUtilities.h:1239
TImageType::Pointer CreateImage(const typename TImageType::Pointer inputImage, const typename TImageType::PixelType value=0)
Create an empty (optionally pass a value) ITK image based on an input image with same properties.
Definition: cbicaITKUtilities.h:955
std::vector< std::string > stringSplit(const std::string &str, const std::string &delim)
Splits the string.
std::vector< typename TImageType::PixelType > GetPixelValuesFromIndeces(const typename TImageType::Pointer inputImage, const std::vector< typename TImageType::IndexType > &indeces)
Get Pixel Values of specified indeces of input Image.
Definition: cbicaITKUtilities.h:154
std::vector< typename TImageType::PixelType > GetUniqueValuesInImage(typename TImageType::Pointer inputImage, bool sortResult=true)
Get the unique values in an image.
Definition: cbicaITKUtilities.h:1212
TImageType::Pointer ChangeImageValues(const typename TImageType::Pointer inputImage, const std::string &oldValues, const std::string &newValues)
Create an empty (optionally pass a value) ITK image based on an input image with same properties.
Definition: cbicaITKUtilities.h:977
Reads any image from file name and generates relevant data.
Definition: cbicaITKImageInfo.h:36
std::vector< typename TImageType::IndexType > GetIndexFromNonZeroPixels(const typename TImageType::Pointer inputImage, const std::string valuesToExclude="0")
Get MD5 sum of a supplied file.
Definition: cbicaITKUtilities.h:210
TImageType::Pointer ResampleImage(const typename TImageType::Pointer inputImage, const itk::Vector< double, TImageType::ImageDimension > &outputSpacing, const std::string interpolator="Linear")
Resample an image to an isotropic resolution using the specified output spacing vector.
Definition: cbicaITKUtilities.h:1048
TImageType::Pointer GetSkullStrippedImage(const typename TImageType::Pointer inputImage, const typename TAtlasImageType::Pointer atlasImage, const typename TAtlasLabelType::Pointer atlasLabelImage)
Get skull stripped image.
Definition: cbicaITKUtilities.h:811
bool ImageSanityCheck(const typename TImageType::Pointer image1, const typename TImageType::Pointer image2)
Check properties of 2 images to see if they are defined in the same space.
Definition: cbicaITKUtilities.h:324
TImageType::Pointer GetAdaptiveHistogramEqualizedImage(const typename TImageType::Pointer inputImage, const typename TImageType::Pointer referenceImage, const float alpha=0.3, const float beta=0.3, const float radius=1, const int numberOfHistogramLevels=100)
Get the indeces of the image which are not zero.
Definition: cbicaITKUtilities.h:262
TImageType::Pointer GetHistogramMatchedImage(const typename TImageType::Pointer inputImage, const typename TImageType::Pointer referenceImage, const int numberOfMatchPoints=40, const int numberOfHistogramLevels=100)
Get the indeces of the image which are not zero.
Definition: cbicaITKUtilities.h:235
std::pair< float, typename TImageType::IndexType > GetMaxDistanceInLabelMap(const typename TImageType::Pointer inputLabelMap, const typename TImageType::IndexType indexForComputation, bool realCoordinateInput=false, bool realCoordinateOutput=false)
Get the maximum distance and corresponding coordinate from a seed point in a label map.
Definition: cbicaITKUtilities.h:890
TImageType::Pointer ResizeImage(const typename TImageType::Pointer inputImage, const size_t resizeFactor, const std::string &interpolator="Linear")
Resize an input image by a factor (expressed as a percentage)
Definition: cbicaITKUtilities.h:1179
float GetDistanceBetweenIndeces(const typename TImageType::IndexType point1, const typename TImageType::IndexType point2)
Get the distance between 2 indeces of an itk::Image.
Definition: cbicaITKUtilities.h:853
bool GetResultOfImageComparasion(const typename TImageType::Pointer referenceImage, const typename TImageType::Pointer checkImage, const typename TImageType::PixelType differenceThreshold=0, const unsigned int toleranceRadius=0, const unsigned long long numberOfPixelsTolerance=10, const typename TImageType::PixelType averageIntensityDifference=0)
Get result of Image comparison between 2 images.
Definition: cbicaITKUtilities.h:289
Some basic utility functions.
std::vector< typename TImageType::PixelType > ExtractPixelValuesFromIndeces(const typename TImageType::Pointer inputImage, const std::vector< typename TImageType::IndexType > &indeces)
Wrap of GetPixelValues.
Definition: cbicaITKUtilities.h:179
Declaration of the ImageInfo class.
std::vector< std::vector< typename TImageType::IndexType > > CreateMaskIndeces(const std::vector< std::vector< typename TImageType::Pointer > > &inputModalitiesAndImages)
Calculate and preserve the mask indeces.
Definition: cbicaITKUtilities.h:88
std::pair< std::string, typename TImageType::Pointer > GetImageOrientation(const typename TImageType::Pointer inputImage)
Perform the deformable registration.
Definition: cbicaITKUtilities.h:544
itk::Vector< float, TImageType::ImageDimension > GetDistances(const typename TImageType::Pointer inputImage)
Get distances in world coordinates across axes for an image.
Definition: cbicaITKUtilities.h:1012