3.3 图像变换
经过3.2节图像滤波的学习,相信大家对图像处理有了一定的了解。不过,图像滤波只是很初级的处理,其目的是提升图像本身的质量。本节要讲到的图像变换,从改变图像的结构入手,将图像变换成不同的形态。限于篇幅,这里重点讨论后续视觉SLAM章节中涉及的一些图像变换算法。其他一些常用图像变换算法将略过,比如频谱变换、小波变换、图像金字塔等,感兴趣的读者可以查阅相关资料。
3.3.1 射影变换
本节从基本概念入手,逐步对射影变换的原理进行解析。首先需要了解的就是重映射(remap),就是把原图中某个位置的像素放到另一个位置,这样原图的所有像素经过重映射操作得到目标图像。原图中的像素与目标图像的像素存在一个对应关系,如式(3-12)所示,其中h(x, y)表示原始图像像素位置与目标图像像素位置的映射关系,比如图像沿水平方向翻转或沿垂直方向翻转就是最典型的映射。
知道重映射是把原图中某个位置的像素放到另一个位置的过程,接下来就可以介绍一些更实用的重映射方法,即欧式变换、相似变换、仿射变换和射影变换。这些变换可以用h(x, y)来表示,欧式变换是最简单的,其实就是对二维图像平面做旋转和平移,如式(3-13)所示。
相似变换,是在欧式变换的基础上增加了尺度变换,即缩放。很简单,只需要在变换矩阵中加入尺度因子s就行了,如式(3-14)所示。
仿射变换,是在相似变换的基础上,将其中的缩放扩展为更一般性的情况,即非均匀缩放,如式(3-15)所示。这里举例来说明非均匀缩放,比如一个长方形经过非均匀缩放可以变成平行四边形。
射影变换,是对仿射变换更一般的推广。其将仿射变换中的变换矩阵的零元素变成了非零元素,这样让射影变换能有非线性的效应出现,如式(3-16)所示。从公式中不难发现,坐标点引入了z坐标值。其实,射影变换在三维空间中就容易理解了。可以把原图像和目标图像看成三维空间中的两种图像,过某一个公共点进行中心投影,这样就能把原图像中的点投射到目标图像上,这也正是射影变换名字的由来。
讲到这里,不难发现,射影变换是最一般的形式,即欧式变换、相似变换和仿射变换是射影变换的特例。下面对这几种重映射方式进行一个总结,如表3-1所示。
表3-1 图像射影变换及其特例总结
不难发现,只要会用射影变换对图像进行变换,欧式变换、相似变换和仿射变换这些特例自然也能用射影变换实现。进行射影变换的关键是要知道变换矩阵,通过原图像的4个点与目标图像的4个点,就能求得射影变换矩阵。有了射影变换矩阵,就很容易得到目标图像了。计算射影变换矩阵的方法已经被封装到OpenCV的getPerspectiveTransform函数了,射影变换的实现方法被封装到OpenCV的warpPerspective函数了。
3.3.2 霍夫变换
在很多场合,提取图像中的直线特征非常有用,霍夫变换就是一种很好的解决办法。按法线式方程,直线用r=x·cosθ+y·sinθ表示。过固定点A(x0, y0)有一簇直线,这一簇直线的参数(r, θ)可以绘制出一条正弦曲线。同理,过固定点B、C等都可以得到一簇直线,当直线簇绘制出来的正弦曲线相交时,说明A、B、C等点过同一条直线,如图3-4所示。霍夫变换就是通过这样的方法来检测直线的。
图3-4 霍夫变换提取直线原理
在实际的操作中,考虑容错和干扰因素,算法会做一些调整优化。在OpenCV中,标准霍夫变换和多尺度霍夫变换被封装在HoughLines函数中,而累计概率霍夫变换被封装在HoughLinesP函数中。由于累计概率霍夫变换拥有更高的执行效率,所以推荐直接使用累计概率霍夫变换。
3.3.3 边缘检测
利用边缘检测能提取图像的轮廓,而图像轮廓可以用于分割图像中的物体或者理解图像的意义。常用的两种边缘检测算法是sobel算法和canny算法。
sobel算法是利用微分求导的方式来近似求解图像的梯度。计算也很简单,先分别求解x和y方向的导数,其实用x和y方向的卷积核分别对图像I进行卷积操作即可,然后将两个方向的导数合成就得到该图像点的近似梯度。求x方向导数的过程如式(3-17)所示,求y方向导数的过程如式(3-18)所示,最终的近似梯度如式(3-19)所示。
canny算法为了提高边缘检测的效果,在sobel算法的基础上做了大量的优化。先用高斯滤波去除图像的噪声;然后用sobel算法求图像的梯度幅值和方向,这里的梯度方向将用于判断像素之间的连接性;接着将候选边缘像素挑选出来,排除非边缘像素;最后使用滞后阈值的方式将最终的边缘像素提取出来,滞后阈值有两个,即高阈值和低阈值,大于高阈值的像素被保留为边缘像素,小于低阈值的像素被排除,如果像素介于两个阈值之间,且与边缘像素相连接,则会被保留下来。sobel算法被封装到OpenCV的Sobel函数,canny算法被封装到OpenCV的Canny函数。
3.3.4 直方图均衡
图像直方图是表示图像中亮点分布的统计图,横坐标是亮度值,纵坐标是每个亮度值对应的像素总数量,如图3-5所示。直方图能反映图像中像素强度的统计信息,是非常重要的统计特征,可以利用这种统计特征判断两幅图的相似性。
图3-5 图像直方图
从图3-5可以看出,图像的像素亮度大都集中在0~150之间,也就是图像整体偏暗。经过直方图均衡后,图像的像素亮度更均匀地分布于0~255区间,图像整体明暗度也更加分明,如图3-6所示。
图3-6 图像直方图均衡
计算直方图的方法被封装在OpenCV的calcHist函数,图像直方图均衡的方法被封装在OpenCV的equalizeHist函数。