赞
踩
要理解投影变换的原理最好能理解仿射变换的原理,关于仿射变换可参考老猿的仿射变换相关系列博文。
图像几何变换又称为图像空间变换,是各种图像处理算法的基础。它是在不改变图像内容的情况下,对图像像素进行空间几何变换的处理方式。它将一幅图像中的坐标位置映射到另一幅图像中的新坐标位置,其实质是改变像素的空间位置,估算新空间位置上的像素值。因此几何变换在变换过程中会建立一种原图像像素与变换后图像像素之间的映射关系,通过这种关系,能够从一方的像素计算出另一方的像素的坐标位置。通常将图像坐标映射到输出的过程称作向前映射,反之,将输出图像映射到输入的过程称作向后映射。向后映射在实践中使用较多,原因是能够避免使用向前映射中出现映射不完全和映射重叠的问题
适当的几何变换可最大程度地消除由于成像角度、透视关系乃至镜头自身原因所造成的几何失真所产生的负面影响。几何变换常常作为图像处理应用的预处理步骤,是图像归一化的核心工作之一。
一个几何变换需要两部分运算:首先是空间变换所需的运算,如平移、缩放、旋转和投影等, 需要用它来表示输出图像与输入图像之间的像素映射关系;此外,还需要使用灰度插值算法, 因为按照这种变换关系进行计算, 输出图像的像素可能被映射到输入图像的非整数坐标上。
图像的几何变换包括透视变换和仿射变换,透视变换又称为投影变换、投射变换、投影映射,透视变换是将图片投影到一个新的视平面,它是二维(x,y)到三维(X,Y,Z)、再到另一个二维(x’,y’)空间的映射。
注:这部分文字写得很干脆和透彻,主要摘抄自CSDN知名博主Eastmount的博文《[Python图像处理] 三十六.OpenCV图像几何变换万字详解(平移缩放旋转、镜像仿射透视)》。
图像透视变换(Perspective Transformation)的本质是将图像从一个几何平面投影到另一个几何平面,透视变换保证同一条直线的点还是在同一条直线上,但不再保证平行了。因为这是一个二维图像经过一个三维变换,然后映射到另外一个二维空间,二维图像的二维空间与映射后的二维空间不一样,如果一样就是仿射变换。
与前面《https://blog.csdn.net/LaoYuanPython/article/details/113788380 图像仿射变换原理3:仿射变换类型及变换矩阵详解》介绍仿射变换的仿射矩阵类似,透视变换也是建立在矩阵运算基础上的,通过矩阵运算可以很快的找到新旧图像的像素对应关系。
透视变换使用如下齐次坐标公式来进行描述:
上面公式中源图像和目标图像的坐标使用齐次坐标方式表示,变换矩阵为3阶方阵,该方阵为一单应性矩阵,就是比仿射矩阵多了一行。
可以看到,透视变换矩阵前2行2列为线性变换矩阵的元素构成(蓝色框标记范围),黄色框标记范围两个元素为平移对应元素,红色椭圆前2行整体为仿射矩阵,灰色矩形标记范围的第三行用于透视变换的空间变换,实际上第三行也只有前两列的m31、m32用于透视变换的空间变换,因为m33可以变换为常量1(关于这点具体请见付费专栏文章《getPerspectiveTransform通过4对点确认透视变换矩阵的原理分析》的分析)。
透视变换主要有三个作用:
图像校正:透视变换可以将原图中涉及平面展现不合理的图像进行校正。为了说明问题,在此借用CSDN博主xiaowei_cqu的《【图像处理】透视变换 Perspective Transformation》中的图例来示意:
图像视角变换:就是将看图的视角进行调整一下,请看如下图:
图像拼接:相机拍照时,最终成像的照片角度大部分情况下不同,如果能将其转成相同的角度,则可以将多张照片进行拼接。进一步的了解大家可以参考单应性矩阵的理解及求解3的介绍。
老猿就这个情况进行了仔细考虑,感觉可以通过如下思路来实现拼接:对于不同的两张涉及景物相邻的照片,找出相邻处都有的景物的相同位置的四个点,对两个图像进行仿射变换,将四个点都映射成相同大小的标准长方形,然后将两张结果图像进行拼接,拼接时将两个长方形完全重合,拼接后再将该结果照片进行仿射变换,确保长方形部分变换成两张原图中任意一张的四个点位置,则二者视角就统一了。找到合适的图像老猿就试一下,试了之后再详细介绍案例。
getPerspectiveTransform函数根据源图像和目标图像上的四对点坐标来计算从原图像透视变换到目标头像的透视变换矩阵。
getPerspectiveTransform(src, dst, solveMethod=None)
3*3
的透视变换矩阵warpPerspective函数用于对输入图像进行透视变换,透视变换使用如下公式来计算结果图像和输入图像的对应关系:
其中Mij代表透视变换矩阵的9个元素。
warpPerspective(src, M, dsize, dst=None, flags=None, borderMode=None, borderValue=None)
如果flags标记设置了WARP_INVERSE_MAP标记,首先使用invertAffineTransform对变换矩阵进行反转即求其逆矩阵,然后将其放入上面的公式中,而不是将M直接放入
输入图像文件名为:f:\pic\Dog15.JPG
,内容即上面说明 图像视角变换的小狗图像,borderMode用缺省值的图像为上面的小狗变换结果图像,下面我们看看borderMode取不同值BORDER_WRAP时的结果图像。
本次将一张输入图像,将其原图像的四角对应四个点,通过透视变换映射到新图像,原图像的四个点中,底部左下和右下两个点保持不变,顶部左上和右上两个点的y坐标值映射为图像高度的一半,x坐标映射为宽带的1/3和2/3处。
import cv2
import numpy as np
def changeView(imgFile):
srcImg = cv2.imread(imgFile)
r,c = srcImg.shape[:2]
pointSrc = [[0,0],[c,0],[0,r],[c,r]]
pointDest = [[int(c/3),int(r/2)],[int(c*2/3),int(r/2)],[0,r],[c,r]]
srcPoints = np.float32(pointSrc)
destPoints = np.float32(pointDest)
m = cv2.getPerspectiveTransform(srcPoints, destPoints)
resultImg = cv2.warpPerspective(srcImg, m, (c,r),flags=cv2.INTER_AREA ,borderMode=cv2.BORDER_WRAP)
cv2.imshow("result img", resultImg)
ch = cv2.waitKey(0)
changeView(r'f:\pic\Dog15.JPG')
关于透视变换更多的案例请参考《https://blog.csdn.net/LaoYuanPython/article/details/113958088 狗狗变形记:任选4点的投影变换warpPerspective OpenCV-Python案例》。
本节详细介绍了透视变换的概念、变换矩阵、作用以及OpenCV-Python相关的处理函数getPerspectiveTransform 和warpPerspective的语法及参数含义,并分析了输入图像和输出图像四对点确认透视变换矩阵的原理。最后提供了一个案例,来演示透视变换的代码实现及效果。本文的有些内容如四对点确认透视变换矩阵,在其他公开资料也有所提及(如CSDN博主lyhbkz的《单应性矩阵的理解及求解3》),但老猿结合齐次坐标和矩阵运算将其细化了,应该是网上公开资料首次全面介绍。相关内容有助于理解透视变换的概念和OpenCV-Python透视变换的应用方式。
1、[Python图像处理] 三十六.OpenCV图像几何变换万字详解(平移缩放旋转、镜像仿射透视)
2、单应性矩阵的理解及求解3
3、【图像处理】透视变换 Perspective Transformation
更多图像处理的介绍请参考专栏《OpenCV-Python图形图像处理 https://blog.csdn.net/laoyuanpython/category_9979286.html》和《https://blog.csdn.net/laoyuanpython/category_10581071.html OpenCV-Python初学者疑难问题集》相关文章。
更多图像处理的数学基础知识请参考专栏《人工智能数学基础 https://blog.csdn.net/laoyuanpython/category_10382948.html》
如果阅读本文于您有所获,敬请点赞、评论、收藏,谢谢大家的支持!
如果对文章内容存在疑问,可以在博客评论区留言,或关注:老猿Python 微信公号发消息咨询。
前两个专栏都适合有一定Python基础但无相关知识的小白读者学习,第三个专栏请大家结合《https://blog.csdn.net/laoyuanpython/category_9979286.html OpenCV-Python图形图像处理 》的学习使用。
对于缺乏Python基础的同仁,可以通过老猿的免费专栏《https://blog.csdn.net/laoyuanpython/category_9831699.html 专栏:Python基础教程目录)从零开始学习Python。
如果有兴趣也愿意支持老猿的读者,欢迎购买付费专栏。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。