我们如何使用最近邻点插值算法围绕自定义枢轴点旋转RGB图像?

时间:2019-06-24 01:05:46

标签: image-processing computer-vision interpolation nearest-neighbor image-rotation

我试图了解计算机视觉中的图像插值算法。我意识到,存在大量的插值技术,例如线性,双三次,最近邻等,用于图像旋转。似乎最近邻技术是该领域中最简单的算法。我了解一些基本概念,例如当我们使用旋转矩阵旋转图像时,由于余弦和正弦运算,新的图像行和列将变为浮点值。因此,我们必须截断浮点值并进行插值以预测丢失的图像坐标处的数据...我知道与该问题非常相关的三个帖子:Post 1; Post 2Post 3

在所有这些文章中,他们都没有解释我们如何围绕自定义枢轴点旋转图像(可以是图像的中心,也可以是偏离实际图像中心的任何其他点)。同样,以上帖子中的大多数答案都只是抛出了一些代码,而没有过多解释如何针对图像旋转问题实现最近邻技术。有人可以解释如何使用最近图像旋转RGB图像(如下图所示)。关于自定义枢轴点的邻居(下图中显示的红色标记)?

Lena Sample Image

1 个答案:

答案 0 :(得分:2)

简单的旋转始终围绕原点。下面的变换矩阵(在这里我使用homogenous coordinates)给出了一个简单的旋转(二维):

    ⎡ r1 -r2 0 ⎤
R = ⎢ r2  r1 0 ⎥
    ⎣ 0   0  1 ⎦

r1r2是相关的,因为它们一起形成了一个单位向量(r1^2 + r2^2 = 1)。通过该变换放置坐标时,它们将绕原点旋转。例如,给定向量p,我们通过将其乘以R使其左旋转。

如果要围绕另一个点旋转,例如(c1c2),则需要平移坐标,以使新点移动到原点,然后应用旋转,然后平移后退:

         ⎡ 1 0 c1 ⎤  ⎡ r1 -r2 0 ⎤  ⎡ 1 0 -c1 ⎤
T' R T = ⎢ 0 1 c2 ⎥  ⎢ r2  r1 0 ⎥  ⎢ 0 1 -c2 ⎥
         ⎣ 0 0 1  ⎦  ⎣ 0   0  1 ⎦  ⎣ 0 0  1  ⎦

将此乘以得到:

         ⎡ r1 -r2 -r1*c1+r2*c2+c1 ⎤   ⎡ 1 0 -r1*c1+r2*c2+c1 ⎤  ⎡ r1 -r2 0 ⎤
T' R T = ⎢ r2  r1 -r2*c1-r1*c2+c2 ⎥ = ⎢ 0 1 -r2*c1-r1*c2+c2 ⎥  ⎢ r2  r1 0 ⎥
         ⎣ 0   0   1              ⎦   ⎣ 0 0  1              ⎦  ⎣ 0   0  1 ⎦

因此,我们可以看到我们可以简单地围绕原点旋转,然后以某种适当的方式转换结果,以得到与我们围绕所选旋转中心进行旋转相同的结果。

考虑到任何可以旋转图像并给出完整结果的图像处理库函数(即其输出图像包含所有输入数据),我们可以通过将结果切成输入大小来重新创建围绕任意点旋转的结果。适当的偏移量。