# The image is full of zero after using resample filter.

**URL:** https://discourse.itk.org/t/the-image-is-full-of-zero-after-using-resample-filter/5232
**Category:** Engineering
**Tags:** itk, resize, cpp
**Created:** [August 1, 2022, 8:46am UTC](https://discourse.itk.org/t/the-image-is-full-of-zero-after-using-resample-filter/5232 "2022-08-01T08:46:17Z")
**Posts on this page:** 11
**Page:** 1

<div class="post-metadata">

### Author: ![Bugmaker](https://discourse.itk.org/user_avatar/discourse.itk.org/bugmaker/32/2500_2.png) [@Bugmaker](https://discourse.itk.org/u/Bugmaker)
#### Post date: [August 1, 2022, 8:46am UTC](https://discourse.itk.org/t/the-image-is-full-of-zero-after-using-resample-filter/5232/1 "2022-08-01T08:46:17Z")

</div>

Hi, I am sorry for troubling you so many times.  
I am trying to resize my image from (530,530,604) -\>(512,512,604), then i use **ResampleImageFilter** , **ScaleTransform** and **BSplineInterpolateImageFunction** to do it. The converted image is full of zeros,why?  
code snippet:

```auto
ImageTypeFloat::SizeType newshape;
newshape[0] = 512;
newshape[1] = 512;
newshape[2] = 604;

ImageTypeFloat::Pointer img = reader->GetOutput();
ImageTypeFloat::SizeType current_size = img->GetLargestPossibleRegion().GetSize();
typedef itk::ResampleImageFilter<ImageTypeFloat, ImageTypeFloat,double,double> ResampleFilterType;
ResampleFilterType::Pointer resamplefilter = ResampleFilterType::New();

using TransformType = itk::ScaleTransform<double, 3>;
auto transform = TransformType::New();
TransformType::ParametersType scaleTransFormParameters = transform->GetParameters();
itk::Point<float, 3> center;

for (int i = 0; i < 3; i++)
{
	scaleTransFormParameters[i] = newshape[i] / current_size[i];
	center[i] = static_cast<float>(static_cast<float>(current_size[i] / 2));
}

transform->SetParameters(scaleTransFormParameters);
transform->SetCenter(center);

typedef itk::BSplineInterpolateImageFunction <ImageTypeFloat, double> InterpolatorType;
InterpolatorType::Pointer interpolator = InterpolatorType::New();

interpolator->SetSplineOrder(1);
resamplefilter->SetTransform(transform);
resamplefilter->SetInterpolator(interpolator);
resamplefilter->SetOutputParametersFromImage(img);

resamplefilter->Update();
ImageTypeFloat::Pointer out = resamplefilter->GetOutput();

```

---

<div class="post-metadata">

### Author: ![dzenanz](https://discourse.itk.org/user_avatar/discourse.itk.org/dzenanz/32/1093_2.png) [@dzenanz](https://discourse.itk.org/u/dzenanz)
#### Post date: [August 1, 2022, 12:48pm UTC](https://discourse.itk.org/t/the-image-is-full-of-zero-after-using-resample-filter/5232/2 "2022-08-01T12:48:37Z")

</div>

> [@Bugmaker](#):
>
> `newshape[i] / current_size[i]`

I think this is integer division, which yields 0. Try `static_cast<double>(newshape[i]) / current_size[i]`

Also, if you input image has non-identity metadata (spacing or direction) the resampling will not work correctly.

---

<div class="post-metadata">

### Author: ![Bugmaker](https://discourse.itk.org/user_avatar/discourse.itk.org/bugmaker/32/2500_2.png) [@Bugmaker](https://discourse.itk.org/u/Bugmaker)
#### Post date: [August 3, 2022, 3:02am UTC](https://discourse.itk.org/t/the-image-is-full-of-zero-after-using-resample-filter/5232/3 "2022-08-03T03:02:25Z")

</div>

Hi, @dzenanz  
I have changed the integer division into float division, but it has little effect.  
I solved this problem by annotating **resamplefilter-\>SetOutputParametersFromImage(img)** and everything has to do with spacing ,origin and direction. I do not know the reason why it works.

---

<div class="post-metadata">

### Author: ![dzenanz](https://discourse.itk.org/user_avatar/discourse.itk.org/dzenanz/32/1093_2.png) [@dzenanz](https://discourse.itk.org/u/dzenanz)
#### Post date: [August 3, 2022, 12:38pm UTC](https://discourse.itk.org/t/the-image-is-full-of-zero-after-using-resample-filter/5232/4 "2022-08-03T12:38:48Z")

</div>

> [@Bugmaker](#):
>
> annotating

What does this mean?

---

<div class="post-metadata">

### Author: ![Bugmaker](https://discourse.itk.org/user_avatar/discourse.itk.org/bugmaker/32/2500_2.png) [@Bugmaker](https://discourse.itk.org/u/Bugmaker)
#### Post date: [August 4, 2022, 3:11am UTC](https://discourse.itk.org/t/the-image-is-full-of-zero-after-using-resample-filter/5232/5 "2022-08-04T03:11:01Z")

</div>

That means:` //resamplefilter->SetOutputParametersFromImage(img)` in c++.  
@dzenanz

---

<div class="post-metadata">

### Author: ![dzenanz](https://discourse.itk.org/user_avatar/discourse.itk.org/dzenanz/32/1093_2.png) [@dzenanz](https://discourse.itk.org/u/dzenanz)
#### Post date: [August 4, 2022, 1:05pm UTC](https://discourse.itk.org/t/the-image-is-full-of-zero-after-using-resample-filter/5232/6 "2022-08-04T13:05:02Z")

</div>

Aha, you meant **commenting out** that line.

In your code sample, I don’t see `resamplefilter->SetInput()`, so I can’t tell what is it that you are resampling. If you used `img` both as input, and output reference, that would be unexpected. I don’t know why it wouldn’t produce some result, though.

---

<div class="post-metadata">

### Author: ![Bugmaker](https://discourse.itk.org/user_avatar/discourse.itk.org/bugmaker/32/2500_2.png) [@Bugmaker](https://discourse.itk.org/u/Bugmaker)
#### Post date: [August 10, 2022, 5:51am UTC](https://discourse.itk.org/t/the-image-is-full-of-zero-after-using-resample-filter/5232/7 "2022-08-10T05:51:48Z")

</div>

Hi @dzenanz .

the img is the input image. I don`t know what does it mean?

> output reference

If you point to **resamplefilter-\>SetOutputParametersFromImage(img);**, I set spacing and shape underneath this code. Don`t be worry.

There is still a problem about resample, sometimes this function does not work( **I mean the image full of zero ,but shape has changed** ), no matter scale up or scale dowm.

---

<div class="post-metadata">

### Author: ![Bugmaker](https://discourse.itk.org/user_avatar/discourse.itk.org/bugmaker/32/2500_2.png) [@Bugmaker](https://discourse.itk.org/u/Bugmaker)
#### Post date: [August 10, 2022, 6:34am UTC](https://discourse.itk.org/t/the-image-is-full-of-zero-after-using-resample-filter/5232/8 "2022-08-10T06:34:45Z")

</div>

This is my full code in this function:

```auto

ImageTypeFloat::SizeType current_size = img->GetLargestPossibleRegion().GetSize();
typedef itk::ResampleImageFilter<ImageTypeFloat, ImageTypeFloat,double,double> ResampleFilterType;
ResampleFilterType::Pointer resamplefilter = ResampleFilterType::New();
	
using TransformType = itk::ScaleTransform<double, 3>;
auto transform = TransformType::New();
itk::FixedArray<float, 3> scaleTransFormParameters;
itk::Point<float, 3> center;
for (int i = 0; i < 3; i++)
{
	scaleTransFormParameters[i] = float(newshape[i]) / current_size[i];
	center[i] = 0;
	//center[i] = static_cast<float>(static_cast<float>(current_size[i] / 2));
}
transform->SetScale(scaleTransFormParameters);
transform->SetCenter(center);
	
typedef itk::BSplineInterpolateImageFunction <ImageTypeFloat, double> InterpolatorType;
InterpolatorType::Pointer interpolator = InterpolatorType::New();
interpolator->SetSplineOrder(order);

resamplefilter->SetTransform(transform);
resamplefilter->SetInterpolator(interpolator);
resamplefilter->SetOutputParametersFromImage(img);
resamplefilter->SetOutputSpacing(target_spacing);
resamplefilter->SetSize(newshape);
resamplefilter->SetInput(img);
resamplefilter->Update();
ImageTypeFloat::Pointer out = resamplefilter->GetOutput();

return out;

```

---

<div class="post-metadata">

### Author: ![dzenanz](https://discourse.itk.org/user_avatar/discourse.itk.org/dzenanz/32/1093_2.png) [@dzenanz](https://discourse.itk.org/u/dzenanz)
#### Post date: [August 10, 2022, 12:59pm UTC](https://discourse.itk.org/t/the-image-is-full-of-zero-after-using-resample-filter/5232/9 "2022-08-10T12:59:40Z")

</div>

If you just want to change resolution of the image, you don’t need the scale transform - implicit identity transform will do. Your image probably has non-zero origin, which makes the resampling miss the object. Here is what I tried:

```cpp
#include "itkImageFileWriter.h"
#include "itkImageFileReader.h"

#include "itkResampleImageFilter.h"
#include "itkScaleTransform.h"
#include "itkBSplineInterpolateImageFunction.h"
using ImageTypeFloat = itk::Image<float, 3>;
ImageTypeFloat::Pointer
resample(ImageTypeFloat::Pointer img, ImageTypeFloat::SizeType newshape, ImageTypeFloat::SpacingType target_spacing, unsigned order = 3)
{
  ImageTypeFloat::SizeType current_size = img->GetLargestPossibleRegion().GetSize();
  typedef itk::ResampleImageFilter<ImageTypeFloat, ImageTypeFloat, double, double> ResampleFilterType;
  ResampleFilterType::Pointer resamplefilter = ResampleFilterType::New();

  using TransformType = itk::ScaleTransform<double, 3>;
  auto transform = TransformType::New();
  itk::FixedArray<float, 3> scaleTransFormParameters;
  itk::Point<float, 3> center;
  for (int i = 0; i < 3; i++)
  {
    scaleTransFormParameters[i] = float(newshape[i]) / current_size[i];
    center[i] = 0;
    // center[i] = static_cast<float>(static_cast<float>(current_size[i] / 2));
  }
  transform->SetScale(scaleTransFormParameters);
  transform->SetCenter(center);

  typedef itk::BSplineInterpolateImageFunction<ImageTypeFloat, double> InterpolatorType;
  InterpolatorType::Pointer interpolator = InterpolatorType::New();
  interpolator->SetSplineOrder(order);

  //resamplefilter->SetTransform(transform);
  resamplefilter->SetInterpolator(interpolator);
  resamplefilter->SetOutputParametersFromImage(img);
  resamplefilter->SetOutputSpacing(target_spacing);
  resamplefilter->SetSize(newshape);
  resamplefilter->SetInput(img);
  resamplefilter->Update();
  ImageTypeFloat::Pointer out = resamplefilter->GetOutput();

  return out;
}

int
main()
{
  auto image = itk::ReadImage<ImageTypeFloat>("interp_out.nrrd");
  ImageTypeFloat::SizeType size = image->GetLargestPossibleRegion().GetSize(); // 64x64x8
  size[2] = 64;
  ImageTypeFloat::SpacingType target_spacing = image->GetSpacing();
  target_spacing[2] /= 8.0;
  auto resampled = resample(image, size, target_spacing);
  itk::WriteImage(resampled, "interp_64.nrrd");
}

```

When scale transform is used, the object gets distorted (in my case, significantly squished). When it is commented out, the resampling works as expected.

With scale transform:

 ![interp1](https://discourse.itk.org/uploads/default/original/2X/9/954a1b26aa0e67400f234d6e71f4310c4d6fb576.png)

Without scale transform:

 ![interp2](https://discourse.itk.org/uploads/default/original/2X/2/2f1176bad68357c7ce722ca6e3fa63849bc453fa.jpeg)

---

<div class="post-metadata">

### Author: ![Bugmaker](https://discourse.itk.org/user_avatar/discourse.itk.org/bugmaker/32/2500_2.png) [@Bugmaker](https://discourse.itk.org/u/Bugmaker)
#### Post date: [August 12, 2022, 1:52am UTC](https://discourse.itk.org/t/the-image-is-full-of-zero-after-using-resample-filter/5232/10 "2022-08-12T01:52:13Z")

</div>

Oh Thanks @dzenanz , it helps me a lot.  
Why do these happen? I mean does the scale transform can not with B-spline?

---

<div class="post-metadata">

### Author: ![dzenanz](https://discourse.itk.org/user_avatar/discourse.itk.org/dzenanz/32/1093_2.png) [@dzenanz](https://discourse.itk.org/u/dzenanz)
#### Post date: [August 12, 2022, 12:55pm UTC](https://discourse.itk.org/t/the-image-is-full-of-zero-after-using-resample-filter/5232/11 "2022-08-12T12:55:00Z")

</div>

Scale transform works with BSpline. But for resampling the image, you don’t need the scale transform. The physical size of the objects in the image remain the same, only the image sampling grid changes (size and spacing).

If you want to change the size of the objects in the image, then you use scaling transform. For example, you want to register a head of a child to a head of an adult - you would need scaling (together with translation and rotation).
