我正在尝试了解图像旋转的最近邻算法的实现。我知道,传统的最近邻算法会计算不同点之间的一些明确的欧几里得距离,并将欧几里德距离最小的点作为最佳点。但是在图像插值中,我在实现中找不到任何明确的欧几里德距离。我是指this对另一个类似问题的回答。给定的解决方案完美地将输入图像旋转给定角度。但是我对代码有很多疑问(我不明白他们在做什么)。
1。)为什么作者将新索引(第4行和第5行)乘以%
?
2。)作者在以下代码行中做了什么(确切地说,我了解他正在将索引乘以旋转矩阵。但是,为什么他有诸如sqrt(2)
,{{ 1}},m/2
和n/2
吗?他对t-mm/2
做些什么?)? :
s-nn/2
任何帮助将不胜感激!
答案 0 :(得分:4)
该代码实现了围绕图像中心的旋转。由于在MATLAB中图像(索引)中的坐标从1开始,因此旋转的自然原点是围绕图像左上角的像素。根据{{3}},这种旋转涉及到移动坐标,应用旋转矩阵,然后将其向后移动。
该代码将图像的中心x=n/2
,y=m/2
以及输入图像的大小m
和n
用作旋转的原点。然后,它会将旋转的坐标进一步向后移,因此新图像的中心位于(mm/2
,nn/2
)处,mm = m*sqrt(2)
和nn = n*sqrt(2)
的大小为输出图像。 (请注意,如果我们旋转45度,则需要输出图像是输入大小的sqrt(2)
倍,以不丢失任何数据,对于较小的旋转,我们可以使用较小的输出大小来做。)
如果将所有这些值都放入我在上一个答案中显示的矩阵中,则应该(希望)获得代码中显示的方程。
最后,该代码具有条件语句,以避免读取输入图像域之外的内容(超出范围的索引会产生错误)。旋转图像并生成更大的输出图像时,一些输出像素将映射到输入图像之外的区域。这些在代码中保留为0。
请注意,链接到的代码根本无效。它不会预分配输出矩阵,因此会在写入输出数组时反复调整其大小,这非常昂贵。它还可以预先计算循环内完成的某些计算,诸如cos(thet)
之类的事情在循环迭代之间不会改变。