一起学python

您所在的位置:网站首页 歌曲黄土高坡原唱是哪位歌唱家创作的 一起学python

一起学python

#一起学python| 来源: 网络整理| 查看: 265

最近在研究SLAM(即时定位和地图构建)和激光雷达。其实我也不太想搞这个的,但是这个其实也算是在做毕业设计吧。图像的几何变换我们已经讲过了缩放了,还有其它几种,平移,旋转,仿射变换等。参考https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_imgproc/py_geometric_transformations/py_geometric_transformations.html。这里再说一下这些几何变换有什么用处呢?有一种应用场景就是图像复原。

主要的用处就是进行几何校正:

什么叫做仿射变换呢?

线性代数里面我们知道,线性变换就相当于乘上一个矩阵(如果我没有记错的话,这个矩阵应该要求是满秩的,因为满秩的才能化为单位阵,那么这个满秩的矩阵可以分解为若干个经过初等行列变换的单位阵,就相等于对x进行初等行列变换)。

来看一个几何校正的例子:

怎么样得到一个正视图呢?通过一个几何变换(不仅仅包含仿射变换)就可以了这里先给出结果:

图像平移

这个其实就是一种特殊的仿射变换,M的前两列就是上面的A,因为是单位阵,所以相当于没有进行线性变换,最后一列是平移向量b。

注意图片的宽是列数,高是行数,注意不要写反。来看一下效果:

很简单的一段代码。

平移的时候,原来没有平移前的图片在左上角区域是有BGR值得,平移之后自动填0。这是因为我们没有选择边界模式(就是镜像,周期,默认是以固定值填充

)和边界值,默认是0。flags是选择插值方式的。参考https://www.cnblogs.com/dupuleng/articles/4055020.html。

如果设置一下。

就是绿色的。

选择镜像填充:

效果是很显然的。这时候再选择边界填充值就没有意义了,因为不是在BORDER_CONSTANT模式下。

图像旋转

旋转也是一种特殊得仿射变换。旋转矩阵其实也不难推导:

opencv提供了可以绕任意点旋转人任意度的函数,这个其实是相当于先旋转,后平移,我来大概演示一下上面的矩阵是怎么来的。

假如黑色的矩阵转某一个角度到红色的矩阵(这个角度不一定是90,我只是随便画一个)。然后再把旋转后的中心坐标平移到指定的中心坐标,假设原来指定的是,也就是没有旋转之前是

旋转的时候这个肯定也会跟着转啊。所以

那么最后要从[a';b']平移到[a;b],距离就是

和上面是一样的。那么首先看一下旋转的函数各个参数的意思。

中心点和角度,scale是缩放倍数。角度按照数学的,应该是逆时针为正的。

效果:

仿射变换

左边的绿点的坐标就是(50,50),(200,50)和(50,200),右边点是(10,100),(200,50)和(100,250)通过CV2.getAffineTransform这个函数来获得它们之间对应的仿射变换。这个过程其实就是再解一个线性方程组,一共有6个未知数,而我们给了三个点的对应关系,可以列出6个方程(横纵坐标是两个),方程组封闭。那么针对线性方程组是可能出现无解或者无穷多节的情况,无穷多解可以随便取一个极大无关组里面的,不知道无解的情况opencv是怎么处理的,是会报错吗?仿射变换不会改变线之间的平行关系。

你们可以算一算,的确把pts1经过M这个仿射变换之后是pts2。效果:

如果胡乱搞一通呢?

这个求出来的结果只对第一个点是对的,50*0.6+50*0.6-50=10;50+50=100;

第二个点都是错的,0.6*200+0.6*200-50=190和100差多了,50+50=100和250也差多了。

事实上,M的前两列构成的矩阵显然不是满秩的。它不是一个线性变换。出来的结果也有问题,都是灰的。

仿射变换必须是三点对三点,这也是为了保证方程组封闭。

透视变换

透视变换不同于仿射变换。参考了https://www.cnblogs.com/liekkas0626/p/5262942.html

和https://www.cnblogs.com/zf-blog/p/7813227.html。

就是要让原图像平面和新图像平面重合。

这两个w和w'可以理解为透视因子,让图像产生透视畸变,可能导致原来的正方形变成一个梯形。因为从(u,v)到(x',y')显然只是一个仿射变换,就是因为加上了w',才产生了透视变换的效果,其实从这里可以看到w=1,因为a31和a33都没有乘w。所以说a13和a23产生透视变换,如果a13=a23=0,透视变换退化为仿射变换,其实仿射变换就是一种特殊的透视变换,上式可以明显看出来原来的(u,v)到(x,y)明显不是一个线性变换。下面是一个例子:

根据上面式子可以得到下面的式子,这里其实已经确认了一件事,就是a33=1。那么就只剩下8个未知数,需要建立8个方程,那么就需要4个点了。也可以理解为指定一个四边形的原始坐标和透视后的坐标。

我们分别来看一个透视变换前后的四边形。pts2显然是一个正方形。

上面这张图应该是通过透视变换可以变换到正视图的(虽然不完全是正视图)。

我们先用matplotlib显示出来:

这是为了确定要变换的四边形,选择这栋楼的四个角,鼠标移动到四个角的时候下面会有坐标。左上角是(216,25);另外三个坐标是(257,591),(903,566)和(841,294)。

效果:

这个结果看来还需要旋转一下。

效果还算可以吧。就是窗户变形了,这就需要去调整一下pts2。

这个效果就好很多了。不过pts是多少合适需要一定的尝试。其实图像处理本来就是偏应用的,很难找到通解,只能具体图片具体分析,具体图片有一些特定的参数才合适。

验证一下a33恒等于1。第一组参数:

第二组:

第三组:

a33全部等于1。这个应该是默认的。

以后有时间会继续做这个系列的,由于我学的是MATLAB,肯定会有MATLAB的一些案例。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3