X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=itk%2FclitkSegmentationUtils.txx;h=2f0d935a7cbbc88d038000768d6bed04bfd2451f;hb=184e72d6817dd7450c804735686745c6ba712943;hp=edb208a7064770fb3cb737107948ff06983395de;hpb=4824cfde923f5f1d70fbb0e63aaf08886a8fb28d;p=clitk.git diff --git a/itk/clitkSegmentationUtils.txx b/itk/clitkSegmentationUtils.txx index edb208a..2f0d935 100644 --- a/itk/clitkSegmentationUtils.txx +++ b/itk/clitkSegmentationUtils.txx @@ -34,6 +34,7 @@ #include #include #include +#include namespace clitk { @@ -463,10 +464,12 @@ namespace clitk { typename ImageType::RegionType region; typename ImageType::SizeType size = image->GetLargestPossibleRegion().GetSize(); typename ImageType::PointType p = image->GetOrigin(); - p[dim] = min; + if (min > p[dim]) p[dim] = min; // Check if not outside the image typename ImageType::IndexType start; image->TransformPhysicalPointToIndex(p, start); - p[dim] = max; + double m = image->GetOrigin()[dim] + size[dim]*image->GetSpacing()[dim]; + if (max > m) p[dim] = m; // Check if not outside the image + else p[dim] = max; typename ImageType::IndexType end; image->TransformPhysicalPointToIndex(p, end); size[dim] = abs(end[dim]-start[dim]); @@ -1327,5 +1330,129 @@ namespace clitk { } //-------------------------------------------------------------------- + + //-------------------------------------------------------------------- + template + typename itk::Image::Pointer + DistanceMap(const ImageType * input, typename ImageType::PixelType BG)//, + // typename itk::Image::Pointer dmap) + { + typedef itk::Image FloatImageType; + typedef itk::SignedMaurerDistanceMapImageFilter DistanceMapFilterType; + typename DistanceMapFilterType::Pointer filter = DistanceMapFilterType::New(); + filter->SetInput(input); + filter->SetUseImageSpacing(true); + filter->SquaredDistanceOff(); + filter->SetBackgroundValue(BG); + filter->Update(); + return filter->GetOutput(); + } + //-------------------------------------------------------------------- + + + //-------------------------------------------------------------------- + template + void + SliceBySliceBuildLineSegmentAccordingToMinimalDistanceBetweenStructures(const ImageType * S1, + const ImageType * S2, + typename ImageType::PixelType BG, + int sliceDimension, + std::vector & A, + std::vector & B) + { + // Extract slices + typedef typename itk::Image SliceType; + typedef typename SliceType::Pointer SlicePointer; + std::vector slices_s1; + std::vector slices_s2; + clitk::ExtractSlices(S1, sliceDimension, slices_s1); + clitk::ExtractSlices(S2, sliceDimension, slices_s2); + + assert(slices_s1.size() == slices_s2.size()); + + // Prepare dmap + typedef itk::Image FloatImageType; + typedef itk::SignedMaurerDistanceMapImageFilter DistanceMapFilterType; + std::vector dmaps1; + std::vector dmaps2; + typename FloatImageType::Pointer dmap; + + // loop on slices + for(uint i=0; i(slices_s1[i], BG); + dmaps1.push_back(dmap); + writeImage(dmap, "dmap1.mha"); + // Compute dmap for S2 + dmap = clitk::DistanceMap(slices_s2[i], BG); + dmaps2.push_back(dmap); + writeImage(dmap, "dmap2.mha"); + + // Look in S2 for the point the closest to S1 + typename SliceType::PointType p = ComputeClosestPoint(slices_s1[i], dmaps2[i], BG); + typename ImageType::PointType p3D; + clitk::PointsUtils::Convert2DTo3D(p, S1, i, p3D); + A.push_back(p3D); + + // Look in S2 for the point the closest to S1 + p = ComputeClosestPoint(slices_s2[i], dmaps1[i], BG); + clitk::PointsUtils::Convert2DTo3D(p, S2, i, p3D); + B.push_back(p3D); + + } + + // Debug dmap + /* + typedef itk::Image FT; + FT::Pointer f = FT::New(); + typename FT::Pointer d1 = clitk::JoinSlices(dmaps1, S1, 2); + typename FT::Pointer d2 = clitk::JoinSlices(dmaps2, S2, 2); + writeImage(d1, "d1.mha"); + writeImage(d2, "d2.mha"); + */ + } + //-------------------------------------------------------------------- + + + //-------------------------------------------------------------------- + template + typename ImageType::PointType + ComputeClosestPoint(const ImageType * input, + const itk::Image * dmap, + typename ImageType::PixelType & BG) + { + // Loop dmap + S2, if FG, get min + typedef itk::Image FloatImageType; + typedef itk::ImageRegionConstIteratorWithIndex ImageIteratorType; + typedef itk::ImageRegionConstIterator DMapIteratorType; + ImageIteratorType iter1(input, input->GetLargestPossibleRegion()); + DMapIteratorType iter2(dmap, dmap->GetLargestPossibleRegion()); + + iter1.GoToBegin(); + iter2.GoToBegin(); + double dmin = 100000.0; + typename ImageType::IndexType indexmin; + while (!iter1.IsAtEnd()) { + if (iter1.Get() != BG) { + double d = iter2.Get(); + if (dTransformIndexToPhysicalPoint(indexmin, p); + return p; + } + //-------------------------------------------------------------------- + + + + } // end of namespace