Python - 双线性图像插值
我正在尝试写一个Python函数,这个函数可以接收一张图片作为输入,并使用双线性插值的方法来调整图片的大小。我已经取得了一些不错的进展,因为图片确实被调整了大小,但这个过程中输出的图片出现了一些黑洞,我搞不清楚这些黑洞是怎么来的,也不知道为什么会出现。
我看到的一些问题并没有对我帮助很大(简单高效的双线性插值方法在numpy和python中的应用)
这是我的代码:
def img_interp(img, scale = 1.5):
angle_rad = pi * angle_deg / 180.0;
rows, cols, colours = img.shape
n_rows = int(round(rows * scale, 0))
n_cols = int(round(cols * scale, 0))
enlarged_img = np.ones((n_rows, n_cols, colours))
for i in range(n_rows - 1):
for j in range(n_cols - 1):
x_coord = j / scale
y_coord = i / scale
xc = int(ceil(x_coord))
xf = int(floor(x_coord))
yc = int(ceil(y_coord))
yf = int(floor(y_coord))
W_xc = xc - x_coord
W_xf = x_coord - xf
W_yc = yc - y_coord
W_yf = y_coord - yf
enlarged_img[i, j, :] = 255 - np.around(W_xc * (W_yc * img[yf, xf, :] + W_yf * img[yc, xf, :]) + W_xf * (W_yc * img[yf, xc, :] + W_yf * img[yc, xc, :]), 0)
return enlarged_img
这是处理后的图片结果:
https://www.dropbox.com/s/ji0frbzcuyxd11u/results.png?m=可能有比我现在的方法更好的解决方案,但如果有人能帮我看看,告诉我哪里做错了或者我还需要做什么,我会非常感激。谢谢!
2 个回答
0
有没有什么理由不使用Python中那些优秀的图像处理库呢?比如,OpenCV里有一个叫做 cv2.resize 的功能,它默认使用双线性插值来处理图像。还有,Scipy也有一个叫做 scipy.misc.imresize 的功能。
5
与其自己重新发明轮子,不如推荐你使用 scipy.ndimage.interpolation.zoom、scipy.misc.imresize 或者 mahotas.zoom。这些工具可以让你选择不同的插值方式,其中1代表线性插值。
至于为什么你的代码不工作,如果你的 x_coord 或 y_coord 是整数的话,那么权重就会变成零。