HansSnah
HansSnah

Reputation: 2250

Interpolate image at specific coordinates

Given an image (array) in rectangular form, how do I interpolate specific pixel positions? The following code produces as 20x30 grid, with each pixel filled with a value (zg). The code then constructs an interpolator with scipy's interp2d method. What I want is to obtain interpolated values at specific coordinates. In the given example, at x = [1.5, 2.4, 5.8], y = [0.5, 7.2, 2.2], so for a total of 3 positions. However, the function returns a 3x3 array for some reason. Why? And how would I change the code so that only these three coordinates would be evaluated?

import numpy as np
from scipy.interpolate import interp2d
    
# Rectangular grid
x = np.arange(20)
y = np.arange(30)
xg, yg = np.meshgrid(x, y)
zg = np.exp(-(2*xg)**2 - (yg/2)**2)
    
# Define interpolator
interp = interp2d(yg, xg, zg)
    
# Interpolate pixel value
zi = interp([1.5, 2.4, 5.8], [0.5, 7.2, 2.2])
    
print(zi.shape) # = (3, 3)

Upvotes: 2

Views: 1241

Answers (1)

blunova
blunova

Reputation: 2532

Your code is fine. The interp interpolation function is computing all the possible combinations of coordinates, i.e. 3 × 3 = 9. For instance:

>>> interp(1.5, 0.5)
array([0.04635516])

>>> interp(1.5, 7.2)
array([0.02152198])

>>> interp(5.8, 2.2)
array([0.03073694])

>>> interp(2.4, 2.2)
array([0.03810408])

Indeed you can find these values in the returned matrix:

>>> interp([1.5, 2.4, 5.8], [0.5, 7.2, 2.2])
array([[0.04635516, 0.04409826, 0.03557219],
       [0.0400542 , 0.03810408, 0.03073694],
       [0.02152198, 0.02047414, 0.01651562]])

The documentation states that the return value is a

2-D array with shape (len(y), len(x))

If you just want the coordinates you need, you can do the following:

xe = [1.5, 2.4, 5.8]
ye = [0.5, 7.2, 2.2]

>>> [interp(x, y)[0] for x, y in zip(xe, ye)]
[0.04635515780224686, 0.020474138863349815, 0.030736938802464715]

Upvotes: 2

Related Questions