我正在尝试使用interpn(在使用Scipy的python中)使用interp3从Matlab复制结果。但是,我正在努力构造我的论点。我尝试了以下行:
f = interpn(blur_maps, fx, fy, pyr_level)
其中模糊图是600 x 800 x 7
,代表七个模糊级别的灰度图像,
fx
和fy
是七个地图的索引。 fx
和fy
都是2d数组。 pyr_level
是一个2d数组,包含从1到7的值,这些值表示要插值的模糊贴图。
我的问题是,由于我错误地排列了参数,如何以一种可行的方式排列它们?我尝试查找示例,但没有看到类似的内容。这是我要插入的数据的示例:
import numpy as np
import cv2, math
from scipy.interpolate import interpn
levels = 7
img_path = '/Users/alimahdi/Desktop/i4.jpg'
img = cv2.cvtColor(cv2.imread(img_path), cv2.COLOR_BGR2GRAY)
row, col = img.shape
x_range = np.arange(0, col)
y_range = np.arange(0, row)
fx, fy = np.meshgrid(x_range, y_range)
e = np.exp(np.sqrt(fx ** 2 + fy ** 2))
pyr_level = 7 * (e - np.min(e)) / (np.max(e) - np.min(e))
blur_maps = np.zeros((row, col, levels))
blur_maps[:, :, 0] = img
for i in range(levels - 1):
img = cv2.pyrDown(img)
r, c = img.shape
tmp = img
for j in range(int(math.log(row / r, 2))):
tmp = cv2.pyrUp(tmp)
blur_maps[:, :, i + 1] = tmp
pixelGrid = [np.arange(x) for x in blur_maps.shape]
interpPoints = np.array([fx.flatten(), fy.flatten(), pyr_level.flatten()])
interpValues = interpn(pixelGrid, blur_maps, interpPoints.T)
finalValues = np.reshape(interpValues, fx.shape)
我现在收到以下错误:ValueError: One of the requested xi is out of bounds in dimension 0
我确实知道问题出在interpPoints
中,但是我不确定如何解决。有什么建议吗?
答案 0 :(得分:0)
scipy.interpolate.interpn
的文档指出,第一个参数是您要插值的数据的网格(这只是像素数的整数),第二个参数是数据(blur_maps
),并且第三个参数是(npoints, ndims)
形式的插值点。因此,您必须执行以下操作:
import scipy.interpolate
pixelGrid = [np.arange(x) for x in blur_maps.shape] # create grid of pixel numbers as per the docs
interpPoints = np.array([fx.flatten(), fy.flatten(), pyr_level.flatten()])
# interpolate
interpValues = scipy.interpolate.interpn(pixelGrid, blur_maps, interpPoints.T)
# now reshape the output array to get in the original format you wanted
finalValues = np.reshape(interpValues, fx.shape)