【发布时间】:2019-11-07 17:10:09
【问题描述】:
我正在尝试了解用于图像旋转的最近邻算法的实现。我知道的常规最近邻算法,计算不同点之间的一些显式欧几里德距离,并将欧几里德距离最小的点作为最佳点。但是在图像插值中,我在实现中没有找到任何明确的欧几里得距离。我指的是this 对另一个类似问题的回答。给定的解决方案将输入图像完美地旋转给定角度。但是我对代码有很多疑问(我不明白他们在做什么)。
1.) 为什么作者将sqrt(2) 乘以新索引(第 4 行和第 5 行)?
2.) 作者在以下代码行中做了什么(准确地说,我知道他是在将索引乘以旋转矩阵。但是为什么他有额外的术语,如m/2、n/2、 t-mm/2 和 s-nn/2 ?他在用 if i>0 && j>0 && i<=m && j<=n 做什么?)? :
for t=1:mm
for s=1:nn
i = uint16((t-mm/2)*cos(thet)+(s-nn/2)*sin(thet)+m/2);
j = uint16(-(t-mm/2)*sin(thet)+(s-nn/2)*cos(thet)+n/2);
if i>0 && j>0 && i<=m && j<=n
im2(t,s,:)=im1(i,j,:);
end
end
end
任何帮助将不胜感激!
【问题讨论】:
-
作者在答案中解释了
sqrt(2)因子,“旋转的图像总是更大,最大旋转45度。因此,sqrt(2) 因子”。至于if条件,所做的只是确保这些点在原始图像im1的范围内。 -
@beaker 是的,我意识到这一点。但为什么只有
sqrt(2)用于乘法?sqrt(2)的意义是什么?在if条件下,我看到他实际上是从源图像中复制数据,而不是进行任何最近邻插值(当我们截断cos(theta)和sin(theta)的浮点值时,估计缺失索引的像素值) .没有使用 b 样条函数或任何其他最近邻插值......他在这里做什么? -
“没有使用 b 样条函数或任何其他最近邻插值” 最近邻插值实际上是找到离您的子像素位置最近的像素并取其值。 B 样条插值是完全不同的东西。舍入浮点位置是最近邻插值。代码应该执行
round(...),而不是截断。它不一样,只会导致两个方向上的半像素偏移,您可能不会注意到。
标签: matlab image-processing interpolation nearest-neighbor image-rotation