Python-双线性图像插值

2024-04-28 08:55:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试编写一个Python函数,它将图像作为输入,并执行双线性图像插值来调整图像的大小。我已经取得了合理的成功,因为图像确实得到了调整,但这个过程在输出中引入了黑洞,我似乎无法弄清楚它们是如何存在的,或者为什么存在的。

我看到的问题对我帮助不大(Simple, efficient bilinear interpolation of images in numpy and 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=

也许有比我做过的更好的方法,但是如果有人能看一眼,告诉我我做错了什么,或者我还需要做什么,我会非常感激。谢谢!


Tags: in图像imgrowsintcolsscalexf
2条回答

我可以推荐scipy.ndimage.interpolation.zoomscipy.misc.imresizemahotas.zoom而不是重新设计轮子吗?你可以选择插值顺序,1是线性的。

至于为什么不起作用,如果x坐标或y坐标恰好是整数,那么权重将为零。

有什么理由不使用Python提供的任何一个优秀的图像处理库吗?例如,OpenCV的cv2.resize默认情况下执行双线性插值。Scipy有scipy.misc.imresize

相关问题 更多 >