python+opencv图像处理(十二)

图像仿射变换和透视变换

天晴了......
1、仿射变换
图像仿射变换就是图像的旋转加上拉升,说直白点,就是把矩形变成平行四边形。
要把矩形变成平行四边行,只需要拉伸其四个角点就行了,事实上,只需要确定前面三个点,最后一个点自然就能确定了。
也就是要改变下图所示的三个点的值,对应到新的平行四边形上相应的三个点即可。
这三个原点以及三个变换后的点呢,就组成了一个变换矩阵M。
opencv提供了根据变换前后三个点的对应关系来自动求解M。这个函数是M=cv2.getAffineTransform(pos1,pos2),其中两个位置就是变换前后的对应位置关系。输出的就是仿射矩阵M。
然后在使用函数cv2.warpAffine()即可完成仿射变换。
如下图所示,左图是原图,右图是仿射变换之后的结果图。
其代码如下:
from matplotlib import pyplot as plt
import cv2
import numpy as np
img = cv2.imread('E:/image/le.jpg')
print(img.shape)
rows,cols = img.shape[:2]
pts1 = np.float32([[0,0],[rows-1,0],[0,cols-1]])#原来三个点的位置
pts2 = np.float32([[20,20],[rows-50,50],[100,cols-100]])#变换后三个点的位置
M = cv2.getAffineTransform(pts1,pts2)#合成变换矩阵
res = cv2.warpAffine(img,M,(cols,rows))#第三个参数:变换后的图像大小
#显示图像
plt.subplot(121)
plt.imshow(img[:,:,[2,1,0]])
plt.axis('off')
plt.title("yuan")
plt.subplot(122)
plt.imshow(res[:,:,[2,1,0]])
plt.axis('off')
plt.title("dst")
plt.show()
2、透视变换
对于透视变换,需要确定四个点的位置,其四个点对应的位置如下图。
可以通过opencv的函数cv2.getPerspectiveTransform找到变换矩阵. 然后将cv2.warpPerspective应用于此3x3变换矩阵,即可完成透视变换。
有一种说法是说,通过透视变换可以将平行四边形变为矩形。
如下图所示,左图为原图,右图为透视变换后的图。
其代码如下:
import cv2
import numpy as np
import matplotlib.pylab  as plt
img = cv2.imread('E:/image/ch.jpg')
print(img.shape)
rows,cols,ch = img.shape
pts1 = np.float32([[20,20],[rows-50,50],[0,cols],[rows-50,cols-50]])#原图四个角点的位置,我的第三个点位置没找对,所以结果图只有1,2,4三个点进行了拉伸,而第3个点没变。
pts2 = np.float32([[0,0],[rows,0],[0,cols],[rows,cols]])#结果图的四个点对应的位置,我这里是四个顶点
M = cv2.getPerspectiveTransform(pts1,pts2)#合成变换矩阵
dst = cv2.warpPerspective(img,M,(cols,rows))#进行变换
#以下为显示图像
plt.subplot(121),plt.imshow(img[:,:,[2,1,0]]),plt.title('Input'),plt.axis('off')
plt.subplot(122),plt.imshow(dst[:,:,[2,1,0]]),plt.title('Output'),plt.axis('off')
plt.show()
(0)

相关推荐

  • Python中基础使用及Numpy、Scipy、Matplotlib 使用教程

    本文主要根据 斯坦福CS231n课程的Python 教程进行整理,原文地址为http://cs231n.github.io/python-numpy-tutorial/,官方Python指南网址htt ...

  • 【从零学习OpenCV 4】图像仿射变换

    重磅干货,第一时间送达 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍<从零学习OpenCV 4>.为了更让小伙伴更早的了解最新版的OpenCV 4,小白与出版社沟通 ...

  • OpenCV探索之路(十七):Mat和IplImage访问像素的方法总结

    在opencv的编程中,遍历访问图像元素是经常遇到的操作,掌握其方法非常重要,无论是Mat类的像素访问,还是IplImage结构体的访问的方法,都必须扎实掌握,毕竟,图像处理本质上就是对像素的各种操作 ...

  • 基于OpenCV的实用图像处理操作

    重磅干货,第一时间送达 图像处理适用于图像和视频.良好的图像处理结果会为后续的进一步处理带来很大的帮助,例如提取到图像中的直线有助于对图像中物体的结构进行分析,良好的特征提取会优化深度学习的结果等.今 ...

  • python+opencv图像处理(二十九)

    高斯滤波 迟到的节日祝福......  粽子节快乐,纪念伟大的屈原先生 (图片来源于网络) 高斯滤波是一种线性平滑滤波,对于消除高斯噪声有很好的效果,对于服从正态分布的噪声非常有效. 高斯滤波就是对整 ...

  • python+opencv图像处理(二十八)

    Prewitt边缘检测算子 Prewitt算子也是一种一阶微分算子,用于边缘检测.与Robert使用2*2的模板不同,Prewitt算子使用的是3*3的模板,利用像素点上下.左右邻点的灰度差来检测边缘 ...

  • python+opencv图像处理(二十六)

    接上篇. 上篇介绍了计算出梯度后,梯度图像的一种显示方式,本篇介绍其他几种显示方式. (2)设置阈值,大于T为梯度,否则不变.即: 如下图所示,由于阈值不同,所显示的梯度图像也会有区别.下图中,第一张 ...

  • python+opencv图像处理(二十五)

    图像锐化(image sharpening)可以增强图像的边缘部分. 1.梯度法 图像锐化的方法很多,梯度法是其中较常用的一种. 梯度是函数变化的一种度量,是一阶导数的二维等效形式,利用梯度的离散逼近 ...

  • python+opencv图像处理(二十四)

    多图像平均法 对于同一个场景拍摄的多张图像,一般情况下是相同的,但是在实际获取和传输图像的过程往往会发生图像失真,所得到图像和原始图像有某种程度的差别.这些都是因为有外界的噪声加入到图像中,因此在对采 ...

  • python+opencv图像处理(二十二)

    中值滤波 中值滤波是比较常用的一种图像平滑处理方法. 其基本思路是通过滤波器遍历图像,取滤波器区域像素值中值为新的像素值. 表示为数学表达式如下: 其中,f(x,y)和g(x,y)分别是原图像和处理后 ...

  • python+opencv图像处理(二十)

    领域平均 滤波的方法是经常用来进行图像增强的方法. 空域滤波指的是利用像素及像素邻域组成的空间进行滤波的方法. 空域滤波主要是借助模板运算来进行的. 模板运算中用得最多的是模板卷积,其主要步骤如下: ...

  • python+opencv图像处理(二十七)

    Robert边缘检测算子 Robert算子是一种利用局部差分算子寻找边缘的算子,它实际也是一种梯度处理法,只是它用的算子与上篇梯度法的算子不一样. 上篇是标准差分算子,而Rboert用的是对角线差分. ...

  • python+opencv图像处理(二十三)

    百分比滤波器 百分比滤波器也称为排序统计滤波器,它基于对模板所覆盖像素的灰度值的排序,然后从排序后的序列中选一个值作为新的像素值. 上篇介绍的中值滤波其实也是百分比滤波器的一种,除了中值滤波以外,最常 ...

  • python+opencv图像处理(二十一)

    上篇介绍了用opencv中的函数blur()实现邻域平均,除了用此函数外,还有其他可实现均值滤波的方法,如下. (1)根据数学公式,实现像素点的运算以实现领域平均. 数学公式在上篇有介绍. (2)用o ...