我们如何使用最近邻插值算法围绕自定义枢轴点旋转 RGB 图像?
How can we rotate an RGB image using nearest neighbor interpolation algorithm about a custom pivot point?
我正在尝试了解计算机视觉中的图像插值算法。我意识到有大量用于图像旋转的插值技术,如线性、双三次、最近邻等。最近邻技术似乎是该领域最简单的算法。我了解基本概念,例如当我们使用旋转矩阵旋转图像时,新图像的行和列由于余弦和正弦运算而变为浮点值。因此我们必须截断浮点值并进行插值以预测缺失图像坐标处的数据......我知道三个与这个问题非常相关的帖子:Post 1; Post 2 and Post 3
在所有这些帖子中,他们都没有解释我们如何围绕自定义轴心点(可以是图像中心或任何其他偏离真实图像中心的点)旋转图像。此外,上面帖子中的大多数答案只是抛出一些代码,而没有太多解释如何为图像旋转问题实现最近邻技术......有人可以解释如何使用最近的旋转 RGB 图像(如下图所示)关于自定义枢轴点的邻居(下图中的红色标记)?
一个简单的旋转总是关于原点的。一个简单的旋转(二维)由以下变换矩阵给出(我在这里使用 homogenous coordinates):
⎡ r1 -r2 0 ⎤
R = ⎢ r2 r1 0 ⎥
⎣ 0 0 1 ⎦
r1
和 r2
相关,因为它们一起形成一个单位向量 (r1^2 + r2^2 = 1
)。当通过该变换放置坐标时,它们围绕原点旋转。例如,给定一个向量 p
,我们将其旋转 left-multiplying,然后将其旋转 R
。
如果你想围绕另一个点旋转,比如(c1
,c2
),你需要平移坐标,使这个新点移动到原点,然后应用旋转,然后翻译回去:
⎡ 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 ⎦
因此,我们可以看到,我们可以简单地围绕原点旋转,然后以某种适当的方式平移结果,以获得与围绕我们选择的旋转中心旋转相同的结果。
给定任何旋转图像并给出完整结果的图像处理库函数(即其输出图像包含所有输入数据),我们可以通过将此结果切割为输入大小来重新创建围绕任意点旋转的结果具有适当的偏移量。
我正在尝试了解计算机视觉中的图像插值算法。我意识到有大量用于图像旋转的插值技术,如线性、双三次、最近邻等。最近邻技术似乎是该领域最简单的算法。我了解基本概念,例如当我们使用旋转矩阵旋转图像时,新图像的行和列由于余弦和正弦运算而变为浮点值。因此我们必须截断浮点值并进行插值以预测缺失图像坐标处的数据......我知道三个与这个问题非常相关的帖子:Post 1; Post 2 and Post 3
在所有这些帖子中,他们都没有解释我们如何围绕自定义轴心点(可以是图像中心或任何其他偏离真实图像中心的点)旋转图像。此外,上面帖子中的大多数答案只是抛出一些代码,而没有太多解释如何为图像旋转问题实现最近邻技术......有人可以解释如何使用最近的旋转 RGB 图像(如下图所示)关于自定义枢轴点的邻居(下图中的红色标记)?
一个简单的旋转总是关于原点的。一个简单的旋转(二维)由以下变换矩阵给出(我在这里使用 homogenous coordinates):
⎡ r1 -r2 0 ⎤
R = ⎢ r2 r1 0 ⎥
⎣ 0 0 1 ⎦
r1
和 r2
相关,因为它们一起形成一个单位向量 (r1^2 + r2^2 = 1
)。当通过该变换放置坐标时,它们围绕原点旋转。例如,给定一个向量 p
,我们将其旋转 left-multiplying,然后将其旋转 R
。
如果你想围绕另一个点旋转,比如(c1
,c2
),你需要平移坐标,使这个新点移动到原点,然后应用旋转,然后翻译回去:
⎡ 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 ⎦
因此,我们可以看到,我们可以简单地围绕原点旋转,然后以某种适当的方式平移结果,以获得与围绕我们选择的旋转中心旋转相同的结果。
给定任何旋转图像并给出完整结果的图像处理库函数(即其输出图像包含所有输入数据),我们可以通过将此结果切割为输入大小来重新创建围绕任意点旋转的结果具有适当的偏移量。