图像旋转最近邻插值算法的解释

时间:2019-06-25 20:00:16

标签: matlab image-processing interpolation nearest-neighbor image-rotation

我正在尝试了解图像旋转的最近邻算法的实现。我知道,传统的最近邻算法会计算不同点之间的一些明确的欧几里得距离,并将欧几里德距离最小的点作为最佳点。但是在图像插值中,我在实现中找不到任何明确的欧几里德距离。我是指this对另一个类似问题的回答。给定的解决方案完美地将输入图像旋转给定角度。但是我对代码有很多疑问(我不明白他们在做什么)。

1。)为什么作者将新索引(第4行和第5行)乘以%

2。)作者在以下代码行中做了什么(确切地说,我了解他正在将索引乘以旋转矩阵。但是,为什么他有诸如sqrt(2),{{ 1}},m/2n/2吗?他对t-mm/2做些什么?)? :

s-nn/2

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:4)

该代码实现了围绕图像中心的旋转。由于在MATLAB中图像(索引)中的坐标从1开始,因此旋转的自然原点是围绕图像左上角的像素。根据{{​​3}},这种旋转涉及到移动坐标,应用旋转矩阵,然后将其向后移动。

该代码将图像的中心x=n/2y=m/2以及输入图像的大小mn用作旋转的原点。然后,它会将旋转的坐标进一步向后移,因此新图像的中心位于(mm/2nn/2)处,mm = m*sqrt(2)nn = n*sqrt(2)的大小为输出图像。 (请注意,如果我们旋转45度,则需要输出图像是输入大小的sqrt(2)倍,以不丢失任何数据,对于较小的旋转,我们可以使用较小的输出大小来做。)

如果将所有这些值都放入我在上一个答案中显示的矩阵中,则应该(希望)获得代码中显示的方程。

最后,该代码具有条件语句,以避免读取输入图像域之外的内容(超出范围的索引会产生错误)。旋转图像并生成更大的输出图像时,一些输出像素将映射到输入图像之外的区域。这些在代码中保留为0。

请注意,链接到的代码根本无效。它不会预分配输出矩阵,因此会在写入输出数组时反复调整其大小,这非常昂贵。它还可以预先计算循环内完成的某些计算,诸如cos(thet)之类的事情在循环迭代之间不会改变。