# problem with interpolating vtkImageData on vtkPolyData with vtkPointInterpolator

**URL:** https://discourse.vtk.org/t/problem-with-interpolating-vtkimagedata-on-vtkpolydata-with-vtkpointinterpolator/6594
**Category:** Support
**Created:** [September 9, 2021, 1:34pm UTC](https://discourse.vtk.org/t/problem-with-interpolating-vtkimagedata-on-vtkpolydata-with-vtkpointinterpolator/6594 "2021-09-09T13:34:20Z")
**Posts on this page:** 11
**Page:** 1

<div class="post-metadata">

### Author: ![martinick](https://discourse.vtk.org/letter_avatar_proxy/v4/letter/m/50afbb/32.png) [@martinick](https://discourse.vtk.org/u/martinick)
#### Post date: [September 9, 2021, 1:34pm UTC](https://discourse.vtk.org/t/problem-with-interpolating-vtkimagedata-on-vtkpolydata-with-vtkpointinterpolator/6594/1 "2021-09-09T13:34:20Z")

</div>

Hi all,  
I’m trying to interpolate a .vti volume on a .vtp mesh using vtkPointInterpolator but I get “Segmentation fault (core dumped)” when I’m updating the vtkPointInterpolator filter. Here is my code:

```auto
import vtk
# Read vtkPolyData
reader = vtk.vtkXMLPolyDataReader()
reader.SetFileName('surfacemesh.vtp')
reader.Update()
surface = reader.GetOutput()

# Read vtkImage
reader = vtk.vtkImageReader()
reader.SetFileName('volume.vti')
reader.Update()
image3D = reader.GetOutput()

# Gaussian kernel
gaussian_kernel = vtk.vtkGaussianKernel()
gaussian_kernel.SetSharpness(2)
gaussian_kernel.SetRadius(12)

interpolator = vtk.vtkPointInterpolator()
interpolator.SetInputData(surface)
interpolator.SetSourceData(image3D)
interpolator.SetKernel(gaussian_kernel)
interpolator.Update()

```

Any ideas to solve this issue?

Thanks!

---

<div class="post-metadata">

### Author: ![dgobbi](https://discourse.vtk.org/user_avatar/discourse.vtk.org/dgobbi/32/18_2.png) [@dgobbi](https://discourse.vtk.org/u/dgobbi)
#### Post date: [September 9, 2021, 2:00pm UTC](https://discourse.vtk.org/t/problem-with-interpolating-vtkimagedata-on-vtkpolydata-with-vtkpointinterpolator/6594/2 "2021-09-09T14:00:59Z")

</div>

Try the vtkXMLImageDataReader (the vtkImageReader is intended for raw files, not .vti files).

---

<div class="post-metadata">

### Author: ![martinick](https://discourse.vtk.org/letter_avatar_proxy/v4/letter/m/50afbb/32.png) [@martinick](https://discourse.vtk.org/u/martinick)
#### Post date: [September 9, 2021, 2:41pm UTC](https://discourse.vtk.org/t/problem-with-interpolating-vtkimagedata-on-vtkpolydata-with-vtkpointinterpolator/6594/3 "2021-09-09T14:41:16Z")

</div>

Hi David,  
thanks for your advice but I got the same error. Here you can find the data: `surfacemesh.vtp` and `volume.vti`  
[surfacemesh.vtp](https://discourse.vtk.org/uploads/short-url/64CRq1wZnCjMdqbHRSMmHrHS80Y.vtp) (20.3 KB)  
[volume.vti](https://discourse.vtk.org/uploads/short-url/pvmqHBsmfweIIkzt1d8WBiWhCS9.vti) (239.7 KB)

---

<div class="post-metadata">

### Author: ![dgobbi](https://discourse.vtk.org/user_avatar/discourse.vtk.org/dgobbi/32/18_2.png) [@dgobbi](https://discourse.vtk.org/u/dgobbi)
#### Post date: [September 9, 2021, 3:30pm UTC](https://discourse.vtk.org/t/problem-with-interpolating-vtkimagedata-on-vtkpolydata-with-vtkpointinterpolator/6594/4 "2021-09-09T15:30:21Z")

</div>

Hmm, the segfault occurs in vtkStaticPointLocator. Maybe a bug?

Try using a different locator to see if it works:

```python
interpolator.SetLocator(vtk.vtkMergePoints())

```

---

<div class="post-metadata">

### Author: ![martinick](https://discourse.vtk.org/letter_avatar_proxy/v4/letter/m/50afbb/32.png) [@martinick](https://discourse.vtk.org/u/martinick)
#### Post date: [September 10, 2021, 9:08am UTC](https://discourse.vtk.org/t/problem-with-interpolating-vtkimagedata-on-vtkpolydata-with-vtkpointinterpolator/6594/5 "2021-09-10T09:08:10Z")

</div>

Thanks for your help @dgobbi , now it works ! Please find below the corrected code and the result.

**CODE**

```python
import vtk
vtp_filename = 'surfacemesh.vtp'
vti_filename = 'volume.vti'
## Read vtkPolyData
reader = vtk.vtkXMLPolyDataReader()
reader.SetFileName(vtp_filename)
reader.Update()
surface = reader.GetOutput()
# Read vtkImage
reader = vtk.vtkXMLImageDataReader() 
reader.SetFileName(vti_filename)
reader.Update()
image = reader.GetOutput()
# Gaussian kernel
gaussian_kernel = vtk.vtkGaussianKernel()
gaussian_kernel.SetSharpness(2)
gaussian_kernel.SetRadius(12)
# Set vtkPointInterpolator
interpolator = vtk.vtkPointInterpolator()
interpolator.SetInputData(surface)
interpolator.SetSourceData(image)
interpolator.SetLocator(vtk.vtkMergePoints())
interpolator.SetKernel(gaussian_kernel)
interpolator.Update()
# Write result
writer = vtk.vtkXMLPolyDataWriter()
writer.SetInputData(interpolator.GetOutput())
writer.SetFileName('interpolated.vtp')
writer.Update()

```

**RESULT**

 ![vtkPointInterpolator_result](https://discourse.vtk.org/uploads/default/original/2X/d/d2afb5d183873308f9be26611b911af83e04c786.png)

---

<div class="post-metadata">

### Author: ![dgobbi](https://discourse.vtk.org/user_avatar/discourse.vtk.org/dgobbi/32/18_2.png) [@dgobbi](https://discourse.vtk.org/u/dgobbi)
#### Post date: [September 10, 2021, 1:19pm UTC](https://discourse.vtk.org/t/problem-with-interpolating-vtkimagedata-on-vtkpolydata-with-vtkpointinterpolator/6594/6 "2021-09-10T13:19:00Z")

</div>

Good to hear that it works. It seems that the vtkStaticPointLocator cannot be used on vtkImageData, and that’s why a different locator must be used.

Note that if you are using VTK 9 and need extra speed, the [vtkImageProbeFilter](https://vtk.org/doc/nightly/html/classvtkImageProbeFilter.html) is specifically designed to efficiently interpolate points from an image (and it’s SMP, too, like vtkPointInterpolator).

```python
interpolator = vtk.vtkImageProbeFilter()
interpolator.SetInputData(surface)
interpolator.SetSourceData(image3D)
interpolator.Update()

```

It uses linear interpolation by default, but it can also do higher order interpolation.

---

<div class="post-metadata">

### Author: ![martinick](https://discourse.vtk.org/letter_avatar_proxy/v4/letter/m/50afbb/32.png) [@martinick](https://discourse.vtk.org/u/martinick)
#### Post date: [September 14, 2021, 7:49am UTC](https://discourse.vtk.org/t/problem-with-interpolating-vtkimagedata-on-vtkpolydata-with-vtkpointinterpolator/6594/7 "2021-09-14T07:49:48Z")

</div>

Many thanks, I’tried the `vtkImageProbeFilter ` and it’s really much faster than the `vtkStaticPointLocator` on vtkImageData 👍

---

<div class="post-metadata">

### Author: ![kerim](https://discourse.vtk.org/user_avatar/discourse.vtk.org/kerim/32/1175_2.png) [@kerim](https://discourse.vtk.org/u/kerim)
#### Post date: [October 27, 2021, 11:04pm UTC](https://discourse.vtk.org/t/problem-with-interpolating-vtkimagedata-on-vtkpolydata-with-vtkpointinterpolator/6594/8 "2021-10-27T23:04:22Z")

</div>

@dgobbi thank you, this helped me to solve similar problem.

I’m interpolating custom object inherited from `vtkDataSet` and I’m wondering is it possible to somehow tell the interpolator that it should look for the points in some order?

My dataset has some [partly predictable structure](https://discourse.vtk.org/t/writing-custom-class-based-on-vtkdataset/6950/3) and I would like to experiment with perfomance (the dataset may take pretty much of memory).

Is it `vtkPointLocator` I should try to look at and probably inherit from it? Or `vtkDataSet::GetPoint()/GetCell()` are the only methods I should improve?

---

<div class="post-metadata">

### Author: ![dgobbi](https://discourse.vtk.org/user_avatar/discourse.vtk.org/dgobbi/32/18_2.png) [@dgobbi](https://discourse.vtk.org/u/dgobbi)
#### Post date: [October 28, 2021, 1:35pm UTC](https://discourse.vtk.org/t/problem-with-interpolating-vtkimagedata-on-vtkpolydata-with-vtkpointinterpolator/6594/9 "2021-10-28T13:35:42Z")

</div>

Hi Kerim, if your data set has cells in addition to points, then try using vtkProbeFilter to do the interpolation. If it’s necessary to use vtkPointInterpolator instead of vtkProbeFilter, then a custom vtkPointLocator subclass is probably the best way to go (the locators have a lot of interface methods, so it might require a lot of work).

---

<div class="post-metadata">

### Author: ![kerim](https://discourse.vtk.org/user_avatar/discourse.vtk.org/kerim/32/1175_2.png) [@kerim](https://discourse.vtk.org/u/kerim)
#### Post date: [November 7, 2021, 2:27am UTC](https://discourse.vtk.org/t/problem-with-interpolating-vtkimagedata-on-vtkpolydata-with-vtkpointinterpolator/6594/10 "2021-11-07T02:27:49Z")

</div>

Thank you for the hints,

I’m facing some problems when using `vtkProbeFilter` even though it works fine in most cases but sometimes there is an incorrect result.

I’m trying to debug and I set the breakpoint in `MyDataset::FindCell()` method but the program never goes there. I don’t understand why but [according to the documentation](https://vtk.org/doc/nightly/html/classvtkProbeFilter.html#a3f8ecf7772d00409715704b2a36b8216) it should.

What maybe the reason of that?

```cpp
  vtkNew<vtkProbeFilter> interpolator;
  interpolator->SetFindCellStrategy(nullptr);
  interpolator->SetCellLocatorPrototype(nullptr);
  interpolator->SetSourceData(raisedGrid); // this is my dataset
  interpolator->SetInputData(imageData); // I want to interpolate my dataset `raisedGrid` on `vtkImageData`
  interpolator->Update();

```

---

<div class="post-metadata">

### Author: ![kerim](https://discourse.vtk.org/user_avatar/discourse.vtk.org/kerim/32/1175_2.png) [@kerim](https://discourse.vtk.org/u/kerim)
#### Post date: [November 8, 2021, 1:23am UTC](https://discourse.vtk.org/t/problem-with-interpolating-vtkimagedata-on-vtkpolydata-with-vtkpointinterpolator/6594/11 "2021-11-08T01:23:05Z")

</div>

I have looked to the source code of `vtkProbeFilter` and understood that when it somehow works with `vtkImageData` it doesn’t use `vtkDataSet::FindCell()` but instead it implements some more effective logic.  
 ![image](https://discourse.vtk.org/uploads/default/original/2X/4/4f05bb4666b0aa4d05c5cd068bcd829d5e251dd7.jpeg)
