]> Creatis software - clitk.git/blobdiff - itk/clitkSegmentationUtils.txx
Merge branch 'master' of git.creatis.insa-lyon.fr:clitk
[clitk.git] / itk / clitkSegmentationUtils.txx
index 76572b594540e9f7393e38a535a40ff3f4ffcb52..de243adc2bc5394f0623ade2b1b490e976991ab6 100644 (file)
@@ -354,7 +354,7 @@ namespace clitk {
       ++iter;
     }
     if (!found) return false;
-    input->TransformIndexToPhysicalPoint(max, point);
+    input->TransformIndexToPhysicalPoint(max, point); // half of the pixel
     return true;
   }
   //--------------------------------------------------------------------
@@ -382,14 +382,12 @@ namespace clitk {
                  int dim, double max, bool autoCrop,
                  typename ImageType::PixelType BG) 
   {
-    typename ImageType::PointType p;
+    typename ImageType::PointType p; 
+    
     image->TransformIndexToPhysicalPoint(image->GetLargestPossibleRegion().GetIndex()+
                                          image->GetLargestPossibleRegion().GetSize(), p);
-    // Add GetSpacing because remove Lower or equal than
-    // DD(max);
-    // DD(p);
-    // DD(max+image->GetSpacing()[dim]);
-    return CropImageAlongOneAxis<ImageType>(image, dim, max+image->GetSpacing()[dim], p[dim], autoCrop, BG);
+
+    return CropImageAlongOneAxis<ImageType>(image, dim, max, p[dim], autoCrop, BG);
   }
   //--------------------------------------------------------------------
 
@@ -404,16 +402,24 @@ namespace clitk {
     // Compute region size
     typename ImageType::RegionType region;
     typename ImageType::SizeType size = image->GetLargestPossibleRegion().GetSize();
-    typename ImageType::PointType p = image->GetOrigin();
+    
+    // Starting index
+    typename ImageType::PointType p = image->GetOrigin(); // not at pixel center !
     if (min > p[dim]) p[dim] = min; // Check if not outside the image
     typename ImageType::IndexType start;
     image->TransformPhysicalPointToIndex(p, start);
-    double m = image->GetOrigin()[dim] + size[dim]*image->GetSpacing()[dim];
+
+    // Size of the region
+    // -1 because last point is size -1
+    double m = image->GetOrigin()[dim] + (size[dim]-1)*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]);
+    size[dim] = abs(end[dim]-start[dim])+1;// +1 because we want to include the point. 
+    
+    // Set region
     region.SetIndex(start);
     region.SetSize(size);
   
@@ -766,8 +772,7 @@ namespace clitk {
   {
     assert((mainDirection==0) || (mainDirection==1));
     typedef itk::ImageSliceIteratorWithIndex<ImageType> SliceIteratorType;
-    SliceIteratorType siter = SliceIteratorType(input, 
-                                                input->GetLargestPossibleRegion());
+    SliceIteratorType siter = SliceIteratorType(input, input->GetLargestPossibleRegion());
     siter.SetFirstDirection(0);
     siter.SetSecondDirection(1);
     siter.GoToBegin();
@@ -786,7 +791,6 @@ namespace clitk {
         A = lA[i];
         B = lB[i];
         C = A;
-      
         // Check that the line is not a point (A=B)
         bool p = (A[0] == B[0]) && (A[1] == B[1]);
       
@@ -1323,11 +1327,11 @@ namespace clitk {
       // Compute dmap for S1 *TO PUT IN FONCTION*
       dmap = clitk::DistanceMap<SliceType>(slices_s1[i], BG);
       dmaps1.push_back(dmap);
-      writeImage<FloatImageType>(dmap, "dmap1.mha");
+      //writeImage<FloatImageType>(dmap, "dmap1.mha");
       // Compute dmap for S2
       dmap = clitk::DistanceMap<SliceType>(slices_s2[i], BG);
       dmaps2.push_back(dmap);
-      writeImage<FloatImageType>(dmap, "dmap2.mha");
+      //writeImage<FloatImageType>(dmap, "dmap2.mha");
       
       // Look in S2 for the point the closest to S1
       typename SliceType::PointType p = ComputeClosestPoint<SliceType>(slices_s1[i], dmaps2[i], BG);
@@ -1373,6 +1377,7 @@ namespace clitk {
     iter2.GoToBegin();
     double dmin = 100000.0;
     typename ImageType::IndexType indexmin;
+    indexmin.Fill(0);
     while (!iter1.IsAtEnd()) {
       if (iter1.Get() != BG) {
         double d = iter2.Get();
@@ -1393,6 +1398,30 @@ namespace clitk {
   //--------------------------------------------------------------------
      
 
+  //--------------------------------------------------------------------
+  template<class ImageType>
+  typename ImageType::Pointer
+  RemoveNegativeIndexFromRegion(ImageType * input) {
+    typedef itk::ChangeInformationImageFilter< ImageType > InfoFilterType; 
+    typename InfoFilterType::Pointer indexChangeFilter = InfoFilterType::New(); 
+    indexChangeFilter->ChangeRegionOn(); 
+    // The next line is commented because not exist in itk 3
+    // typename InfoFilterType::OutputImageOffsetValueType indexShift[3];
+    long indexShift[3];
+    typename ImageType::IndexType index = input->GetLargestPossibleRegion().GetIndex();
+    for(uint i=0;i<ImageType::ImageDimension; i++)
+      indexShift[i] = (index[i]<0 ? -index[i]:0);
+    typename ImageType::PointType origin;
+    for(uint i=0;i<ImageType::ImageDimension; i++)
+    origin[i] = input->GetOrigin()[i] - indexShift[i]*input->GetSpacing()[i];
+    indexChangeFilter->SetOutputOffset( indexShift ); 
+    indexChangeFilter->SetInput(input); 
+    indexChangeFilter->SetOutputOrigin(origin);
+    indexChangeFilter->ChangeOriginOn();
+    indexChangeFilter->Update();
+    return indexChangeFilter->GetOutput();
+  }
+  //--------------------------------------------------------------------
 
 
 } // end of namespace