我正在尝试对图像进行倾斜,如下所示


(来源: 微软网站)
.

我有一组代表我的图像的像素,但不确定如何处理它们。

有帮助吗?

解决方案

一个更好的方法来做到这一点是通过逆映射。

从本质上讲,你想“经”的形象,对不对?这意味着源图像中的每个像素都到了预定的点 - 预定义是变换矩阵,它告诉你如何旋转,缩放,平移,剪切等,这些基本上是把你的图像上的一些协调(x,y)和说,图像,“好,对于该像素的新位置是(f(x),g(y))

这基本上就是“变形”一样。

现在,想想缩放图像...比方说,到十倍大小。因此,这意味着,在(1,1)像素变为(10,10)像素 - 再下一个像素,(1,2)成为新的图像像素(10,20)。但是,如果你继续这样做,你不会有任何值像素,(13,13)因为,(1.3,1.3)未在原始图像中定义,你将有一大堆的孔在你的新形象 - 你将不得不使用插值该值它周围的四个像素中的新图像,即(10,10) , (10,20), (20,10), (200,2) - 这被称为双线性插值

但这里有一个问题,假设您的转型不是简单的缩放和为仿射(就像你张贴的样本图像) - 然后(1,1)会成为像(2.34,4.21),然后你必须圆他们的输出图像中到(2,4)然后你必须做新的图像双线性插值来填充孔或更复杂的插值 - 凌乱权

现在,还有的没有办法,以摆脱插值的,但我们可以做的双线性插值脱身,只是一次。怎么样?简单,逆映射。

而不是看它的源图像要去新形象,想到这里为新的图像数据将来自源图像中!所以,(1,1)在新的图像将来自源图像中的一些反向映射,说,(3.4, 2.1)然后执行源图像上的双线性内插来找出对应的值!

变换矩阵

好了,你是怎么定义的仿射变换的变换矩阵? 本网站告诉您如何通过合成做不同变换矩阵进行旋转,剪切,等等。

转换:

“替代文字”

合成

“替代文字”

在最终矩阵可以通过按照该次序合成每个矩阵实现和您转化它得到的逆映射。 - 使用此计算源图像中的像素的位置和内插

其他提示

如果你不喜欢重新发明轮子,检查了OpenCV库。它实现了许多有用的图像处理功能,包括透视变换。查看 cvWarpPerspective 我已经习惯很容易地完成这个任务。

正如 KennyTM 所评论的,您只需要一个仿射变换,它是通过将每个像素乘以矩阵获得的线性映射 中号 并将结果添加到平移向量中 V. 。这是简单的数学

end_pixel_position = M*start_pixel_position + V

在哪里 中号 是简单变换(如旋转或缩放)的组合, V 是一个向量,通过向每个像素添加固定系数来平移图像的每个点。

例如,如果你想旋转图像,你可以将旋转矩阵定义为:

    | cos(a) -sin(a) |
M = |                |
    | sin(a)  cos(a) |

在哪里 a 是您想要旋转图像的角度。

缩放使用以下形式的矩阵:

    | s1   0 |
M = |        |
    | 0   s2 |

在哪里 s1s2 是两个轴上的缩放因子。

对于翻译,你只需向量 V:

    | t1 |
V = |    |
    | t2 |

这增加了 t1t2 到像素坐标。

然后,您可以将矩阵合并到一个转换中,例如,如果您进行缩放、旋转和平移,您最终会得到如下结果:

| x2 |             | x1 |
|    | = M1 * M2 * |    | + T
| y2 |             | y1 |

在哪里:

  • x1y1 是应用变换之前的像素坐标,
  • x2y2 是变换后的像素,
  • M1M2 是用于缩放和旋转的矩阵(记住: 矩阵的组合不可交换!通常 M1 * M2 * Vect != M2 * M1 * Vect),
  • T 是用于平移每个像素的平移向量。
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top