]> Creatis software - clitk.git/blobdiff - itk/clitkCropLikeImageFilter.txx
Set Directions to CropImage Like
[clitk.git] / itk / clitkCropLikeImageFilter.txx
index 0af957bb20c6e8ae57e5b560920c3a907719ceea..e7e342fce498464947a9dd841aad4cb54da0cf29 100644 (file)
@@ -21,9 +21,7 @@
 
 // clitk
 #include "clitkCommon.h"
-
-// itk
-#include "itkPasteImageFilter.h"
+#include "clitkPasteImageFilter.h"
 
 //--------------------------------------------------------------------
 template <class ImageType>
@@ -32,7 +30,7 @@ CropLikeImageFilter():itk::ImageToImageFilter<ImageType, ImageType>() {
   this->SetNumberOfRequiredInputs(1);
   m_LikeImage = NULL;
   m_LikeFilenameIsGiven = false;
-  this->SetBackgroundValue(0);
+  this->SetBackgroundValue(typename PixelTraits<typename ImageType::PixelType>::ValueType(0));
   m_CropAlongThisDimension.resize(ImageType::ImageDimension);
   for(uint i=0; i<ImageType::ImageDimension; i++)
     m_CropAlongThisDimension[i] = true;
@@ -105,12 +103,17 @@ GenerateOutputInformation() {
   typename ImageType::IndexType likeStart;
   typename ImageType::PointType likeOrigin;  
   typename ImageType::SpacingType likeSpacing;  
+  typename ImageType::DirectionType likeDirection;
+  typename ImageType::DirectionType like_invDirection;
   if (m_LikeImage) {   
     likeSize = m_LikeImage->GetLargestPossibleRegion().GetSize();
     likeStart = m_LikeImage->GetLargestPossibleRegion().GetIndex();
     likeOrigin = m_LikeImage->GetOrigin();
     likeSpacing = m_LikeImage->GetSpacing();
-    output->CopyInformation(m_LikeImage);
+    likeDirection = m_LikeImage->GetDirection();
+    //I don't know really why I need the inverse...
+    like_invDirection = likeDirection.GetInverse();
+    //output->CopyInformation(m_LikeImage);
   }
   else {
     // Only load the header (allows to use 'like' with any image type)
@@ -121,8 +124,12 @@ GenerateOutputInformation() {
         likeStart[i] = 0;//header->GetIORegion().GetIndex()[i];
         likeOrigin[i] = header->GetOrigin(i);
         likeSpacing[i] = header->GetSpacing(i);
+        for(unsigned int j=0; j<ImageType::ImageDimension; j++)
+            likeDirection[i][j] = header->GetDirection(i)[j];
+       }
+      //I don't know really why I need the inverse...
+      like_invDirection = likeDirection.GetInverse();
       }
-    }
     else {
       clitkExceptionMacro("You should provide SetCropLikeFilename or SetCropLike to CropLikeImageFilter");
     }
@@ -136,6 +143,16 @@ GenerateOutputInformation() {
                           << ") of 'like' is " << likeSpacing[i] << ".");
     }
   }
+
+  // Check that we must crop along each dimension. If not, we use the
+  // size of the input image
+  for(unsigned int i=0; i<ImageType::ImageDimension; i++) {
+    if (m_CropAlongThisDimension[i] == false) {
+      likeStart[i] = input->GetLargestPossibleRegion().GetIndex()[i];
+      likeSize[i] = input->GetLargestPossibleRegion().GetSize()[i];
+    }
+  }
+
   // Define output region 
   m_OutputRegion.SetIndex(likeStart);
   m_OutputRegion.SetSize(likeSize);
@@ -144,6 +161,7 @@ GenerateOutputInformation() {
   output->SetBufferedRegion(m_OutputRegion);
   output->SetSpacing(likeSpacing);  
   output->SetOrigin(likeOrigin);
+  output->SetDirection(like_invDirection);
   output->Allocate(); // Needed ?
 
   // get startpoint source/dest
@@ -218,7 +236,7 @@ GenerateData() {
   output->FillBuffer(GetBackgroundValue());
   
   // Paste image inside
-  typedef itk::PasteImageFilter<ImageType,ImageType> PasteFilterType;
+  typedef clitk::PasteImageFilter<ImageType,ImageType> PasteFilterType;
   typename PasteFilterType::Pointer pasteFilter = PasteFilterType::New();
   //pasteFilter->ReleaseDataFlagOn(); // change nothing ?
   //  pasteFilter->InPlaceOn(); // makt it seg fault
@@ -233,5 +251,59 @@ GenerateData() {
 }
 //--------------------------------------------------------------------
    
-#endif //#define CLITKAUTOCROPFILTER
+
+//--------------------------------------------------------------------
+template<class ImageType>
+typename ImageType::Pointer
+clitk::ResizeImageLike(const ImageType * input,                       
+                       const itk::ImageBase<ImageType::ImageDimension> * like, 
+                       typename ImageType::PixelType backgroundValue) 
+{
+  typedef clitk::CropLikeImageFilter<ImageType> CropFilterType;
+  typename CropFilterType::Pointer cropFilter = CropFilterType::New();
+  cropFilter->SetInput(input);
+  cropFilter->SetCropLikeImage(like);
+  cropFilter->SetBackgroundValue(backgroundValue);
+  cropFilter->Update();
+  return cropFilter->GetOutput();  
+}
+//--------------------------------------------------------------------
+
+
+//--------------------------------------------------------------------
+template<class ImageType>
+typename ImageType::Pointer
+clitk::ResizeImageLike(const ImageType * input,                       
+                       typename itk::ImageBase<ImageType::ImageDimension>::RegionType * region, 
+                       typename ImageType::PixelType backgroundValue) 
+{
+  typename ImageType::Pointer output = ImageType::New();
+  output->CopyInformation(input);
+  typename ImageType::RegionType reg;
+  reg.SetIndex(region->GetIndex());
+  reg.SetSize(region->GetSize());
+  output->SetRegions(reg);
+  output->Allocate();
+  return clitk::ResizeImageLike<ImageType>(input, output, backgroundValue);
+}
+//--------------------------------------------------------------------
+
+
+//--------------------------------------------------------------------
+template<class ImageType>
+typename ImageType::Pointer
+clitk::ResizeImageLike(const ImageType * input, 
+                       typename itk::BoundingBox<unsigned long, ImageType::ImageDimension>::Pointer bb, 
+                       typename ImageType::PixelType BG)
+{
+  typename ImageType::RegionType region;
+  clitk::ComputeRegionFromBB<ImageType>(input, bb, region);
+  typename ImageType::Pointer output = ImageType::New();
+  output->CopyInformation(input);
+  output->SetRegions(region);
+  output->Allocate();
+  return clitk::ResizeImageLike<ImageType>(input, output, BG);   
+}
+//--------------------------------------------------------------------
+
+#endif //#define CLITKCROPLIKEIMAGEFILTER_TXX