gpt4 book ai didi

image - 双线性图像插值/缩放 - 计算示例

转载 作者:行者123 更新时间:2023-12-03 01:00:24 25 4
gpt4 key购买 nike

我想问你一些关于双线性插值/缩放细节的问题。让我们假设我们有这个矩阵:

|100 | 50 |
|70 | 20 |

这是一个 2 x 2 灰度图像。现在,我想将其缩放为 2 倍,我的矩阵如下所示:
| 100   | f1 | 50 | f2 |
| f3 | f4 | f5 | f6 |
| 70 | f7 | 20 | f8 |

所以如果我们想计算 f4 ,计算定义为
f1 = 100 + 0.5(50 - 100) = 75
f7 = 70 + 0.5(20 - 70) = 45

现在终于:
f4 = 75 + 0.5(45 - 75) = 60

但是,我无法真正理解什么计算适合 f3 f1

我们是否分别在每个方向上进行双线性缩放?因此,这意味着:
f3 = 100 + 0.5(70 - 100) = 85
f1 = 100 + 0.5(50 - 100) = 75

还有,我该怎么治疗 f2、f6、f8 .这些点是否像最近邻算法一样简单地被复制?

最佳答案

我想向您指出来自维基百科的这张非常有见地的图表,它说明了如何对一个点进行双线性插值:



来源:Wikipedia

可以看到,四个红点是什么是已知的 .这些点你事先知道和P是我们希望插入的点。因此,我们必须执行两个步骤(如您在帖子中指出的那样)。处理x坐标(水平),我们必须计算顶行红点和底行红点的内插值是行明智的。这导致两个蓝点 R1R2 .处理y坐标(垂直),我们使用两个蓝色点并垂直插值得到最终的P点。

当您调整图像大小时,即使我们在视觉上看不到我要说的内容,但可以想象此图像是 3D信号 f .矩阵中的每个点实际上都是一个 3D 坐标,其中列位置是 x值,行位置是 y值和 z value 是矩阵本身的数量/灰度值。因此,做z = f(x,y)是位置 (x,y) 处矩阵的值矩阵中。在我们的例子中,因为您正在处理图像,每个值 (x,y)是从 1 到与我们所拥有的行/列一样多的整数,具体取决于您查看的维度。

因此,给定要在 (x,y) 处插值的坐标,并给出上图中的红色坐标,我们称之为 x1,y1,x2,y2根据图表 - 特别是按照图表的约定并引用图像的访问方式:x1 = 1, x2 = 2, y1 = 2, y2 = 1 ,蓝色坐标R1R2使用同一行通过一维插值逐列计算,两个点重合:

R1 = f(x1,y1) + (x - x1)/(x2 - x1)*(f(x2,y1) - f(x1,y1))
R2 = f(x1,y2) + (x - x1)/(x2 - x1)*(f(x2,y2) - f(x1,y2))

需要注意的是 (x - x1) / (x2 - x1)重量/比例输出在 f(x1,y1) 处看到的两个值之间包含多少混合和 f(x2,y1)R1f(x1,y2)f(x2,y2)R2 .具体来说, x1是起点和 (x2 - x1)x的区别值。您可以验证替换 x1x给我们 0 而 x2x给我们 1。这个权重在 [0,1] 之间波动这是计算工作所必需的。

需要说明的是图片的来源 位于左上角 ,等等 (1,1)位于左上角。一旦找到 R1R2 ,我们可以找到 P通过插入行明智:
P = R2 + (y - y2)/(y2 - y1)*(R1 - R2)

再次, (y - y2) / (y2 - y1)表示比例/混合多少 R1R2为最终输出做出贡献 P .因此,您计算了 f5正确,因为您使用了四个已知点:左上角是 100,右上角是 50,左下角是 70,右下角是 20。具体来说,如果你想计算 f5 ,这意味着 (x,y) = (1.5,1.5)因为我们在 100 和 50 之间,因为您将图像缩放了 2。如果将这些值代入上述计算中,您将获得预期的 60 值。两种计算的权重也将导致 0.5 ,这就是您在计算中得到的,这就是我们所期望的。

如果你计算 f1 ,这对应于 (x,y) = (1.5,1)如果你把它代入上面的等式,你会看到 (y - y2)/(y2 - y1)给你 0 或权重为 0,所以计算的只是 R2 ,仅对应于沿顶行的线性插值。同样,如果我们计算 f7 ,这意味着我们要在 (x,y) = (1.5,2) 处进行插值.在这种情况下,您将看到 (y - y2) / (y2 - y1)为 1 或权重为 1 等 P = R2 + (R1 - R2) ,简化为 R1并且是仅沿底行的线性插值。

现在有 f3 的情况和 f5 .这些都对应于 (x,y) = (1,1.5)(x,y) = (2,1.5)分别。将这些值替换为 R1R2P对于这两种情况,请给出:
f3
R1 = f(1,2) + (1 - 1)/(2 - 1)*(f(2,2) - f(1,2)) = f(1,2)
R2 = f(1,1) + (1 - 1)/(2 - 1)*(f(1,2) - f(1,1)) = f(1,1)
P = R1 + (1.5 - 1)*(R1 - R2) = f(1,2) + 0.5*(f(1,2) - f(1,1))

P = 70 + 0.5*(100 - 70) = 85
f5
R1 = f(1,2) + (2 - 1)/(2 - 1)*(f(2,2) - f(1,2)) = f(2,2)
R2 = f(1,1) + (2 - 1)/(2 - 1)*(f(1,2) - f(1,1)) = f(1,2)
P = R1 + (1.5 - 1)*(R1 - R2) = f(2,2) + 0.5*(f(2,2) - f(1,2))

P = 20 + 0.5*(50 - 20) = 35

那么这告诉我们什么呢?这意味着您正在内插 仅沿 y 方向 .当我们查看 P 时,这一点很明显。 .更彻底地检查 P 的计算每个 f3f5 ,您会看到我们仅考虑沿垂直方向的值。

因此,如果您想要一个明确的答案, f1f7通过沿 x 插值找到/列方向仅沿同一行。 f3f5通过插值找到 y/沿同一列的行方向。 f4使用 f1 的混合物和 f7如您所见,计算最终值。

要回答您的最后一个问题, f2 , f6f8根据个人喜好填写。这些值被认为是越界的, xy值都为 2.5这不在我们的 [1,2] 范围内网格为 (x,y) .在 MATLAB 中,此方法的默认实现是将定义边界之外的任何值填充为非数字 ( NaN ),但有时,人们使用线性插值进行外推、复制边界值或执行一些复杂的填充像对称或圆形填充。这取决于你处于什么情况,但对于如何填写 f2没有正确和明确的答案。 , f6f8 - 这完全取决于您的应用程序以及对您来说最有意义的内容。

作为奖励,我们可以验证我的计算在 MATLAB 中是否正确。我们首先定义一个网格为 (x,y)积分在 [1,2]范围,然后调整图像的大小,使其两倍大,我们指定的分辨率为每点 0.5 而不是 1。我将调用您定义的矩阵 A :
A = [100 50; 70 20]; %// Define original matrix
[X,Y] = meshgrid(1:2,1:2); %// Define original grid of points
[X2,Y2] = meshgrid(1:0.5:2.5,1:0.5:2.5) %// Define expanded grid of points
B = interp2(X,Y,A,X2,Y2,'linear'); %// Perform bilinear interpolation

原版 (x,y)点网格看起来像:
>> X

X =

1 2
1 2

>> Y

Y =

1 1
2 2

将矩阵的大小扩大两倍的扩展网格如下所示:
>> X2

X2 =

1.0000 1.5000 2.0000 2.5000
1.0000 1.5000 2.0000 2.5000
1.0000 1.5000 2.0000 2.5000
1.0000 1.5000 2.0000 2.5000

>> Y2

Y2 =

1.0000 1.0000 1.0000 1.0000
1.5000 1.5000 1.5000 1.5000
2.0000 2.0000 2.0000 2.0000
2.5000 2.5000 2.5000 2.5000
B是使用 X 的输出和 Y作为点的原始网格和 X2Y2是我们想要插入的点。

我们得到:
>> B

B =

100 75 50 NaN
85 60 35 NaN
70 45 20 NaN
NaN NaN NaN NaN

关于image - 双线性图像插值/缩放 - 计算示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32124170/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com