图像扭曲(Image Warping)

参考博客1: https://blog.csdn.net/ZYTTAE/article/details/42507541
参考博客2:https://blog.csdn.net/sinat_38925719/article/details/88678045

图片扭曲(仿射变换)
  • 拉伸、收缩、扭曲、旋转是图像的几何变换,在三维视觉技术中大量应用到这些变换,又分为仿射变换和透视变换。仿射变换通常用单应性(homography)建模,利用cvWarpAffine解决稠密仿射变换,用cvTransform解决稀疏仿射变换。仿射变换可以将矩形转换成平行四边形,它可以将矩形的边压扁但必须保持边是平行的,也可以将矩形旋转或者按比例变化。透视变换提供了更大的灵活性,一个透视变换可以将矩阵转变成梯形。当然,平行四边形也是梯形,所以仿射变换是透视变换的子集。

  • 仿射变换其实就是将图片上每一个像素点按照一定的规律映射到新的位置上,实际上就是求解新的x,y的过程,这跟矩阵仿射变换非常像,仿射变换的实质其实就是将原图像的三个点映射到目标图片三个新的位置上,这三个位置对于原图片来说位于左上角,左下角以及右上角,通过把原图片上三个点映射到目标图片三个新的位置上。

空间图像几何变换包括两个主要步骤:

(1) 空间坐标变换

(2)变换坐标的赋值、插值运算

空间坐标变换一般可以表达为如下式子:
在这里插入图片描述

对于用得普遍的仿射变换,可以表达为如下式子:

在这里插入图片描述

(x, y)为变换后的坐标,(v, w)为变换前的坐标。通过变换矩阵T,可以进行图像的缩放,旋转,平移等。有了坐标的变换,下面一步就是进行像素灰度级的赋值了。从原始图像映射到变换图像,赋值的时候需要进行插值运算。通常情况下有三种插值运算:最邻近插值法、双线性插值法、双三次插值法。

在仿射变换的一般表达式中,有两种基本的变换方法。第一种是forward mapping, 第二种 是inverse mapping(backward mapping)。在inverse mapping 中,(v, w) = T¬-1(x, y)。一般情况下,inverse mapping 比forward mapping更有效。仿射变换的原始坐标中,首先将原坐标变换为齐次坐标(齐次坐标的理解)。并且经过仿射变换后,你有了图像插值的基础,这样你就可以学习Image Warping了。姑且翻译为图像扭曲吧。Image Warping 同时也分为 Forward Warping 和 Backward Warping。下面一一介绍:

Forward Warping

图像扭曲(Image Warping)_第1张图片
和Mapping一样,都是从原始图像向目标图像映射。其中(x’,y’)= T(x,y),x,y为原始图像坐标。同理,作为Backward Warping则为相反的方向。

Backward Warping
图像扭曲(Image Warping)_第2张图片其中,(x,y) =inverse(T (x’,y’))。就是从目标图像向原始图像进行映射了。

对于这两种方法,那么哪一种的效果比较好呢?如果实验一下,就会知道,Backward Warping效果比Forward Warping效果好。Forward Warping容易产生空洞及像素的重叠,使其结果不理想。

我想原理还是不难理解的。但是如果我们真正要动手去实现这个个东西,仔细想想,还是缺点什么?那就是缺少变换函数(变换矩阵),就像文章前面提到的仿射变换需要变换矩阵T,那么我们这里需要的是变换矩阵H,英文叫Homography,单应矩阵。如果已经有幅图像,只需要找到原始图像中的任意四个点坐标(其中至少三个点不在同一条直线上),并且指定目标图像中的四个点,这样通过这八个点,就能求出变换矩阵H。由于楼主只实验了Backward Warping,所以下面以Backward Warping为例子进行说明,Forward Warping与其类似,但是变换方向不一样,自然H的方向就不一样。具体过程如下:

图像扭曲(Image Warping)_第3张图片
变换矩阵H是3X3,根据对其次坐标的理解,H的最后一个元素始终为1,又由于只需要各四个点,所以可以看到最后只取到了h32。并且x,y全部已知,可以通过最小二乘方法求取H:

在这里插入图片描述
最后,再在得到的H中,根据齐次坐标的概念,求得最终映射的坐标点:

图像扭曲(Image Warping)_第4张图片
在这里插入图片描述
注意,h33 = 1。

代码网上有很多,自行查找!

你可能感兴趣的:(图像处理)