【问题标题】:Bilinear Interpolation from wikipedia来自维基百科的双线性插值
【发布时间】:2021-08-13 06:20:31
【问题描述】:

我已尝试阅读维基百科页面 https://en.wikipedia.org/wiki/Bilinear_interpolation 上的双线性插值,并且我已经实现了其中一种算法,我想知道我是否做对了。

这是我从页面实现的算法:

这是我试图在代码中实现的:

for(int i = 0; i < w; i++) {
    for( int j = 0; j < h; j++) {
        new_img(i,j,0) = old_img(i,j,0)*(1-i)(1-j) + old_img(i+1,j,0)*i*(1-j) + old_img(i,j+1)*(1-i)*j + old_img(i+1,j+1,0)*i*j;
    }
}

是这样实现的吗?

【问题讨论】:

  • 双线性插值处理将值“置于”已知像素之间。例如,如果您想重新缩放或扭曲图像并将值放在缺失的地方。在等式中,索引 x、y 不是整数而是浮点数,目标是在 x 轴和 y 轴上找到 0 到 1 之间的位置值。试着准确地解释你想要做什么。
  • 我想使用双线性插值来调整图像大小
  • 在opencv中的resize函数中实现(有实现它的标志INTER_LINEAR)。你想自己实现吗?
  • 是的,我想自己实现。我正在自学计算机视觉,并且正在学习华盛顿大学的课程,这是作业中的一个问题:github.com/holynski/cse576_sp20_hw2
  • 这个答案帮助我解决了理解和解决问题:stackoverflow.com/a/26143655/10613210

标签: opencv computer-vision bilinear-interpolation


【解决方案1】:

双线性插值处理对图像进行上采样。它尝试估计一个数组(例如图像)已知值之间的值。例如,如果我有一张图像并且我想估计它在位置 (10.5, 24.5) 中的值,则该值将是四个邻居中的值的加权平均值:(10,24), (10,25) , (11,24), (11,25) 是已知的。公式是您在问题中发布的方程式。

这是python代码:

    scale_factor = 0.7

    shape = np.array(image.shape[:2])
    new_shape = np.ceil(shape * scale_factor).astype(int)

    grid = np.meshgrid(np.linspace(0, 1, new_shape[1]), np.linspace(0, 1, new_shape[0]))
    grid_mapping = [i * s for i, s in zip(grid, shape[::-1])]

    resized_image = np.zeros(tuple(new_shape))
    for x_new_im in range(new_shape[1]):
        for y_new_im in range(new_shape[0]):
            mapping = [grid_mapping[i][y_new_im, x_new_im] for i in range(2)]
            x_1, y_1 = np.floor(mapping).astype(int)
            try:
                resized_image[y_new_im, x_new_im] = do_interpolation(f=image[y_1: y_1 + 2, x_1: x_1 + 2], x=mapping[0] - x_1, y=mapping[1] - y_1)
            except ValueError:
                pass


def do_interpolation(f, x, y):
    return np.array([1 - x, x]).dot(f).dot([[1 - y], [y]])

说明:
new_shape = np.ceil(shape * scale_factor).astype(int) - 计算重新缩放后的新图像形状。
grid = np.meshgrid(np.linspace(0, 1, new_shape[1]), np.linspace(0, 1, new_shape[0]))
grid_mapping = [i * s for i, s in zip(grid, shape[::-1])] - 生成 ax,y 网格,当 x 从0 到调整大小图像的宽度,y 从 0 到新图像的高度。现在,我们有了从新图像到原始图像的逆映射。
在 for 循环中,我们查看调整大小的图像中的每个像素,以及原始图像中它的来源。源不是整数,而是浮点数(分数)。
现在我们取原始图像中映射的 x 和 y 周围的四个像素。例如,如果映射的 x,y 在 (17.3, 25.7) 中,我们将取原始图像的四个像素值:(17, 25), (17, 26), (18, 25), (18 , 26)。然后我们将应用您带来的方程式。

注意:
我添加了一个 try-except,因为我不想处理边界,但您可以编辑代码来执行此操作。

【讨论】:

  • 您能否解释一下每一行的作用,因为 python 语法有时会让我感到困惑。 'do_interpolation' 还有什么作用?它是如何进行插值的?
  • 我添加解释。对不起,我忘记了do_interpolation函数,我加了。
  • 您使用什么公式将源转换为浮点数?
  • 是从dest到source的映射。映射不必是整数,因为比例因子可以是任何数字。所以在大多数情况下,映射将是一个非整数索引,这就是你需要插值的原因。
  • 你能帮我理解双线性插值背后的数学吗?所以假设我在我的新 img 数组中的像素位置 (3,5),我需要确定该位置的像素,我将如何在像素位置 (3,5) 执行双线性插值?
猜你喜欢
  • 2013-02-27
  • 1970-01-01
  • 1970-01-01
  • 2014-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-24
相关资源
最近更新 更多