使用透视变换倾斜图像
-
20-09-2019 - |
题
解决方案
一个更好的方法来做到这一点是通过逆映射。
从本质上讲,你想“经”的形象,对不对?这意味着源图像中的每个像素都到了预定的点 - 预定义是变换矩阵,它告诉你如何旋转,缩放,平移,剪切等,这些基本上是把你的图像上的一些协调(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)
- 这被称为双线性插值 。 p>
但这里有一个问题,假设您的转型不是简单的缩放和为仿射(就像你张贴的样本图像) - 然后(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 |
在哪里 s1
和 s2
是两个轴上的缩放因子。
对于翻译,你只需向量 V:
| t1 |
V = | |
| t2 |
这增加了 t1
和 t2
到像素坐标。
然后,您可以将矩阵合并到一个转换中,例如,如果您进行缩放、旋转和平移,您最终会得到如下结果:
| x2 | | x1 |
| | = M1 * M2 * | | + T
| y2 | | y1 |
在哪里:
x1
和y1
是应用变换之前的像素坐标,x2
和y2
是变换后的像素,M1
和M2
是用于缩放和旋转的矩阵(记住: 矩阵的组合不可交换!通常M1 * M2 * Vect != M2 * M1 * Vect
),T
是用于平移每个像素的平移向量。