了解 MATLAB/Mathematica 的双线性插值

信息处理 图像处理 matlab
2022-02-11 12:04:02

我正在尝试了解如何使用双线性和双三次变换来调整图像大小。我根据我在这里和维基百科等阅读的内容编写了一个调整大小的函数,但我得到的结果与 MATLAB 和 Mathematica 给出的不同。

一个最小的工作示例是im=[100 50 0]MATLAB 或im={1, .5, 0}Mathematica 中的图像。我的算法(和“常识”)告诉我,将此图像的大小调整为 5 个像素应该分别给出 im=[100 75 50 25 0]i={1, .75, .5, .25, 0}但是, 当强制使用双线性方法时,我会从 MATLAB 和 Mathematica得到im=[100 80 50 20 0]和。i={1, .8, .5, .2, 0}具体来说,MATLAB 命令

im=[100 50 0];
imresize(im,[1,5],'bilinear')

返回

ans =  100.0000   80.0000   50.0000   20.0000         0

他们显然在做与我的代码(和常识)相同但不同的事情。

有人可以向我解释他们的算法吗?我猜我的错误与如何“索引”新图像有关。原始图像,只有一行,具有恒定的“ y”值 1,具有列x=1,2,3我假设新图像可以被视为具有索引为 的列x=1, 1.5, 2, 2.5, 3,并且需要插值来计算 和 的f(1.5,1)f(2.5,1)

谢谢。

2个回答

imresize在 Matlab 和 Octave 上得到不同的结果。Octave 中的那个调用该interp2函数,该函数的 with'bilinear'方法将返回 you [100 75 50 25 0]

但是,Matlab 中似乎有一些额外的处理。它对图像执行仿射变换。对输出图像中的每个像素计算插值,然后使用贡献权重逆映射到输入图像中像素的索引。所以我猜映射的坐标不是均匀分布的(在你的情况下,在 [1,2] 和 [2,3] 之间不完全是 1.5 和 2.5)。

可能您可以edit imresize_old看到比imresize.