imresize双线性插值MATLAB

3
我尝试使用MATLAB调整图像大小,但是在使用双线性模式的imresize函数时,有一些奇怪的问题需要理解。
我将给您一些示例以确保问题所在。假设以下内容是1D矩阵。
A: [0 1 2]
B: [1 2 0 5]

据我所知,将A的线性插值缩放到[1,5]的一维数组中,会产生以下效果:

A: [0, 0.5, 1, 1.5, 2]

然而,从MATLAB来看,

imresize(A,[1,5],'bilinear')

展示
[0, 0.4, 1, 1.6, 2.0]

此外,
imresize(B,[1,5],'bilinear')
imresize(B,[1,10],'bilinear')

每个,展示

[1.0 1.7 1.0 1.5 2.0]
[1.0 1.1667 1.16111 1.8889 1.0000 0.1111 1.9444 4.1667 5.0000]

我发现许多来自不同论坛的问题和答案都不能满足我对于普遍性的要求。
然而,我在“imresize.m”文件中的一行代码里找到了答案。
u = x/scale + 0.5 * (1-1/scale)

u 确定了输出矩阵的索引。从上面可以看出,我认识到了 使用双线性插值的imresize函数 是如何产生奇怪的输出的。

但问题是: 我不理解 0.5 * (1-1/scale) 的意义。

如果没有 0.5 * (1-1/scale), 那么 u = x/scale 就会采用原始算法,其输出为

A: [0, 0.5, 1, 1.5, 2],这是真正的线性输出。

那么,为什么我们需要 0.5 * (1-1/scale) ?它的目的和意义是什么?


在代码中,刚好在那一行上面的注释告诉你为什么(在我的版本:R2016b):“输入空间坐标。计算反向映射,使得输出空间中的0.5映射到输入空间中的0.5,输出空间中的0.5+scale映射到输入空间中的1.5。”事实上,这段代码中出现那行的部分已经有很好的文档记录了。每一行都有注释。阅读注释并查看它们是否有意义。 - rayryeng
1
此外,我从头开始编写了一个双线性插值函数,而没有使用 imresize。请查看该函数在实践中是否达到了您的期望...它应该会:https://dev59.com/2V8e5IYBdhLWcg3wEG7A#26143655。 - rayryeng
谢谢您的回答!我实际上读了评论,但是为什么是0.5呢?我还是无法理解。 - Mark Yoon
1个回答

2
假设您的图像是A = [0 1 2],因此我们可以将图像像素的结构可视化为:
     _________ _________ _________ 
    |         |         |         |
    |    0    |    1    |    2    |
    |_________|_________|_________|

    0   0.5   1   1.5   2   2.5   3

该像素的x坐标范围从0到3,像素值的位置假定在其中心。

当我们想将图像调整为5个像素时,我们应该找到从原始图像提取值的位置。为此,我们将[0:5]乘以3/5

     _____ _____ _____ _____ _____ 
    |     |     |     |     |     |
    |     |     |     |     |     |
    |_____|_____|_____|_____|_____|

    0    3/5   6/5   9/5   12/5   3

为了找到像素中心的位置,我们将([0:4] + .5)乘以3/5
((0:4) + .5) * 3/5

ans = 
    0.3   0.9   1.5   2.1   2.7

所以,例如要找到缩放后图像中第二个像素的值,我们应该参考原始图像中位置为0.9的像素,并提取(插值)像素的值为0.4。
     _____ _____ _____ _____ _____ 
    |     |     |     |     |     |
    |     | 0.4 |  1  | 1.6 |     |
    |_____|_____|_____|_____|_____|

      0.3   0.9   1.5   2.1   2.7  

第一个像素和最后一个像素的值(以及那些位置在[0.5-2.5]之外的像素)分别设置为原始图像的第一个和最后一个像素的值。

     _____ _____ _____ _____ _____ 
    |     |     |     |     |     |       
    |  0  | 0.4 |  1  | 1.6 |  2  |
    |_____|_____|_____|_____|_____|

2
非常感谢您的清晰图示!我能理解方程式'u = x/scale + 0.5 * (1-1/scale)。在您的例子中,A [0] = 0从索引0.5开始,但是当我们将其视为从索引1开始时,那么我们应该从右侧(x / scale + 0.5)的每个方格的索引中减去0.5*1/scale。 - Mark Yoon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接