python图像处理实战 豆瓣,python的图像处理
本文主要讲解图像仿射变换和图像透视变换,并通过Python调用OpenCV函数。
本文由eastmount分享自华为云社区《[Python图像处理] 十二.图像几何变换之图像仿射变换、图像透视变换和图像校正》。
一、图像仿射变换图像仿射变换,也称图像仿射映射,在几何学中是指通过线性变换后的平移,将一个向量空间变换到另一个向量空间。通常图像旋转加图像拉伸就是图像仿射变换。仿射变换需要一个M矩阵,但是由于仿射变换的复杂性,很难找到这个M矩阵。
OpenCV提供了函数——cv2。getaffinetransform(pos1,pos2)根据变换前后三点的对应关系自动求解M,其中pos 1和Pos2表示变换前后位置的对应关系,输出结果为仿射矩阵M .然后利用函数cv2.warpAffine()实现图像仿射变换。图5-14显示了仿射变换前后的效果。
图像仿射变换的函数原型如下:
M=cv2.getAffineTransform(pos1,pos2)
1表示变换前的位置1,pos2表示变换后的位置cv2。Warpaffin (src,m,(列,行))
表示src原始图像的m表示仿射变换矩阵(rows,cols)表示变换后图像的大小,rows表示行数,cols表示列数,实现代码如下:
#编码:utf-8
导入cv2
将numpy作为np导入
将matplotlib.pyplot作为plt导入
#阅读图片
src=cv2.imread(test.bmp )
#获取图像大小
rows,cols=src.shape[:2]
#设置图像仿射变换矩阵
pos1=np.float32([[50,50],[200,50],[50,200]])
pos2=np.float32([[10,100]、[200,50]、[100,250]])
M=cv2.getAffineTransform(pos1,pos2)
#图像仿射变换
result=cv2.warpAffine(src,M,(cols,rows))
#显示图像
cv2.imshow(原始,src)
cv2.imshow(result ,结果)
#等待显示
cv2.waitKey(0)
2.cv2.destroyAllWindows()的输出渲染如下:
二。图像透视变换。透视变换的本质是将图像投射到一个新的视觉平面上。同样,OpenCV通过函数cv2.getperspective变换(pos1,pos2)构造一个矩阵M,其中pos 1和pos 2分别代表变换前后四个点的对应位置。获得m后,通过函数cv2.warpperspective (src,m,(cols,rows))执行透视变换。
图像透视变换的功能原型如下:
m=cv2 . getperspective transform(pos 1,pos2)
1表示透视变换前四个点的对应位置,pos1表示透视变换后四个点的对应位置CV2。扭曲透视(src,m,(列,行))。
m表示原始图像src表示透视变换矩阵(rows,cols ),表示变换后的图像尺寸,rows表示行数,cols表示列数。代码如下:
#编码:utf-8
导入cv2
将numpy作为np导入
将matplotlib.pyplot作为plt导入
#阅读图片
src=cv2.imread(test01.jpg )
#获取图像大小
rows,cols=src.shape[:2]
#设置图像透视变换矩阵
pos1=np.float32([[114,82]、[287,156]、[8,322]、[216,333]])
pos2=np.float32([[0,0],[188,0],[0,262],[188,262])
m=cv2 . getperspective transform(pos 1,pos2)
#图像透视变换
result=cv2.warpPerspective(src,M,(190,272))
#显示图像
cv2.imshow(原始,src)
cv2.imshow(result ,结果)
#等待显示
cv2.waitKey(0)
2.cv2.destroyAllWindows()的输出结果如下图所示:
三。基于图像透视变换的图像校正。参考下面t6_17大神的文章,通过图像透视变换实现图像校正功能。
假设有一张A4纸图像,现在需要通过调用图像透视变换来校正图像。
代码如下:
#编码:utf-8
导入cv2
将numpy作为np导入
将matplotlib.pyplot作为plt导入
#阅读图片
src=cv2.imread(test01.jpg )
#获取图像大小
rows,cols=src.shape[:2]
#高斯模糊源图像
img=cv2。高斯布朗(src,(3,3),0)
#执行灰度处理。
gray=cv2.cvtColor(img,cv2。COLOR_BGR2GRAY)
#边缘检测(检测图像的边缘信息)
边缘=cv2。Canny(灰色,50,250,apertureSize=3)
cv2.imwrite(canny.jpg ,edges)
#通过霍夫变换得到A4纸边缘
lines=cv2。HoughLinesP(edges,1,np.pi/180,50,minLineLength=90,maxLineGap=10)
#下面输出的四个点分别是四个顶点。
对于行[0]中的x1、y1、x2、y2:
打印(x1,y1),(x2,y2)
空军中尉
打印(x1,y1),(x2,y2)
#绘制边缘
对于行[0]中的x1、y1、x2、y2:
cv2.line(灰色,(x1,y1),(x2,y2),(0,0,255),1)
#根据四个顶点设置图像透视变换矩阵
pos1=np.float32([[114,82]、[287,156]、[8,322]、[216,333]])
pos2=np.float32([[0,0]、[188,0]、[0,262]、[188,262])
m=cv2。获取透视变换(位置1,位置2)
#图像透视变换
result=cv2.warpPerspective(src,M,(190,272))
#显示图像
cv2.imshow(原始,src)
cv2.imshow(result ,结果)
#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()运行结果如下图所示:
四。图像几何变换总结最后补充图像几何代码所有变换,希望读者能体会下相关的代码,并动手实践下。输出结果以女神为例:
完整代码如下:
#编码:utf-8
导入cv2
将数组作为铭牌导入
将matplotlib.pyplot作为血小板计数导入
#读取图片
img=cv2.imread(test3.jpg )
image=cv2.cvtColor(img,cv2 .COLOR_BGR2RGB)
#图像平移矩阵
M=np.float32([[1,0,80],[0,1,30]])
rows,cols=image.shape[:2]
img1=cv2.warpAffine(image,M,(cols,rows))
#图像缩小
img2=cv2.resize(image,(200,100))
#图像放大
img3=cv2.resize(image,None,fx=1.1,fy=1.1)
#绕图像的中心旋转
#源图像的高、宽以及通道数
row,cols,channel=image.shape
#函数参数:旋转中心旋转度数规模
m=cv2。getrotationmatrix 2d((cols/2,rows/2),30,1)
#函数参数:原始图像旋转参数元素图像宽高
img4=cv2.warpAffine(image,M,(cols,rows))
#图像翻转
img5=cv2.flip(image,0) #参数=0以X轴为对称轴翻转
img6=cv2.flip(image,1) #参数0以Y轴为对称轴翻转
#图像的仿射
pts1=np.float32([[50,50],[200,50],[50,200]])
pts2=np.float32([[10,100],[200,50],[100,250]])
M=cv2.getAffineTransform(pts1,pts2)
img7=cv2.warpAffine(image,M,(rows,cols))
#图像的透射
pts1=np.float32([[56,65]、[238,52]、[28,237]、[239,240])
pts2=np.float32([[0,0]、[200,0]、[0,200]、[200,200])
m=cv2。获取透视变换(pt S1,pts2)
img8=cv2.warpPerspective(image,M,(200,200))
#循环显示图形
titles=[源,移位,缩小,放大,旋转, flipX , flipY ,仿射,传输]
images=[image,img1,img2,img3,img4,img5,img6,img7,img8]
对于xrange(9)中的我:
plt.subplot(3,3,i 1),plt.imshow(images[i], gray )
工厂名称(标题[我])
plt.xticks([]),plt.yticks([])
plt.show()
点击关注,第一时间了解华为云新鲜技术~
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。