【图像处理】OpenCV+Python图像处理入门教程(四)几何变换

【图像处理】OpenCV+Python图像处理入门教程(四)几何变换,第1张

概述这篇随笔介绍使用OpenCV进行图像处理的第四章 几何变换。 4 几何变换 图像的几何变换是指将一幅图像映射到另一幅图像内。有缩放、翻转、仿射变换、透视、重映射等 *** 作。 4.1 缩放 使用cv2.re

       这篇随笔介绍使用OpenCV进行图像处理的第四章 几何变换。

4  几何变换

       图像的几何变换是指将一幅图像映射到另一幅图像内。有缩放、翻转、仿射变换、透视、重映射等 *** 作。

4.1  缩放

使用cv2.resize()函数实现对图像的缩放,但要注意cv2.resize()函数内的dsize参数与原图像的行列属性是相反的,也就是:目标图像的行数是原始图像的列数,目标图像的列数是原始图像的行数。

下面举例说明cv2.resize()函数的用法:

1 import cv22 img=cv2.imread('E:/python_opencv/tupian.jpg')3 rows,cols=img.shape[0:2]   #行数和列数等于img的长度和宽度4 size=(int(cols*0.9),int(rows*0.5))   比例:列变为原来0.9倍,行变为0.5倍5 rst=cv2.resize(img,size)   将img按size比例缩放6 print(img.shape=,img.shape)7 rst.shape=',rst.shape)

运行程序的结果如下:

img.shape=(600,60,3)rst.shape=(300,54,3)

可以看出,行数变为原来的0.5倍,列数变为原来的0.9倍。代码中size的行列位置发生了交换。

 

4.2  翻转

使用cv2.flip()函数对图像翻转,能够实现水平方向翻转、垂直方向翻转、两个方向同时翻转。

下面举例说明cv2.flip()函数的用法:

 1  2 img=cv2.imread( 3 x=cv2.flip(img,0)      图x对原图像绕x轴翻转 4 y=cv2.flip(img,1)      图y对原图像绕y轴翻转 5 xy=cv2.flip(img,-1)    图xy对原图像绕x轴y轴同时翻转 6 cv2.imshow(img 7 cv2.imshow(x 8 cv2.imshow(y 9 cv2.imshow(xy10 cv2.waitKey()11 cv2.destroyAllwindows()

程序运行结果如下四幅图,第一幅是原图,第二幅是绕x轴翻转,第三幅是绕y轴翻转,第四幅是绕x轴y轴同时翻转。

 

4.3  仿射

仿射变换是指图像实现平移、旋转等 *** 作。

先设置一个变换矩阵M,然后使用cv2.warpAffine()函数对原图像和变换矩阵M进行仿射 *** 作。

(一)平移

要实现图像的平移,我们先自定义一个转换矩阵,再进行仿射平移变换。例程如下:

 2  numpy as np 3 img=cv2.imread(E:\python_opencv/tupian.jpg 4 height,wIDth=img.shape[:2]         读取原图像的长和宽 5 x=100                                           自定义转换矩阵M的x轴移动值 6 y=200                                           自定义转换矩阵M的y轴移动值 7 M=np.float32([[1,x],[0,1,y]])       构造转换矩阵M 8 move=cv2.warpAffine(img,M,(wIDth,height))   平移映射orginal10 cv2.imshow(move11 12 cv2.destroyAllwindows()

程序运行结果如下图所示,左为原图,右为平移后的图。

(二)旋转

使用函数cv2.getRotationMatrix2D()获得转移矩阵M,然后使用函数cv2.warpAffine()进行仿射旋转变换。例程如下:

3 height,wIDth=img.shape[:2]   4 M=cv2.getRotationMatrix2D((wIDth/2,height/2),45,0.6)   以中心为原点,逆时针旋转45°,且缩小为原图的0.6倍,获得转移矩阵M5 rotate=cv2.warpAffine(img,1)">旋转映射6 cv2.imshow(original7 cv2.imshow(rotation8 9 cv2.destroyAllwindows()

程序运行结果如下图所示,左为原图,右为旋转后的图。

 

4.4  透视

透视变换是指将矩阵图形投影到另一个视平面,可以映射为任意四边形,所以透视变换也被称为投影映射(Projection MapPing),并不是字面意义上的“透视”。透视与上节的仿射不同,仿射可以将矩阵映射为任意平行四边形。

使用cv2.warpPerspective()函数实现透视变换。例程如下:

完成图像透视 3  4 img=cv2.imread( 5 rows,cols=img.shape[:2]       6 print(rows,cols) 7 生成旋转矩阵M 8 pts1=np.float32([[150,50],[400,[60,450],[310,450]]) 9 pts2=np.float32([[50,[rows-50,[50,cols-50],cols-5010 M=cv2.getPerspectivetransform(pts1,pts2)使用函数cv2.warpPerspective()进行透视变换12 dst=cv2.warpPerspective(img,(cols,rows))13 cv2.imshow(14 cv2.imshow(dst15 16 cv2.destroyAllwindows()

程序运行结果如下图所示,左为原图,右为透视变换的图。

我们可以看到,原图片经过透视映射后,变成另一个视角下的任意四边形了。

 

4.5  重映射

重映射是修改了像素点的位置,从而生成一幅新的图像,包括:复制、绕x轴y轴翻转,x轴y轴互换,图像缩放等。

均使用cv2.remap()重映射函数进行 *** 作。

需要注意cv2.remap()中的两个参数mapx、mapy。mapx表示对应位置上x轴坐标值,mapy表示对应位置上y轴坐标值。

(一)复制

使用cv2.remap()函数完成图像复制,需先定义mapx,mapy的值,然后循环映射每个像素点到对应的位置上。

代码如下:

 4 rows,cols=img.shape[:2]                  读取行列数 5 mapx=np.zeros(img.shape[:2],np.float32)  mapx参数设定为对应位置上的x轴坐标值 6 mapy=np.zeros(img.shape[:2],1)">mapy参数设定为对应位置上的y轴坐标值for i in range(rows):                    对每个元素复制映射 8     for j in range(cols): 9         mapx.itemset((i,j),j)        mapy.itemset((i,i)11 rst=cv2.remap(img,mapx,mapy,cv2.INTER_liNEAR)12 cv2.imshow(result14 15 cv2.destroyAllwindows()

执行后结果如下所示,可以看到,实现了图像的复制重映射。

(二)绕x轴翻转

重映射法对图像绕x轴翻转,表明mapx的值保持不变,mapy的值调整为总行数-1-当前行号,其余部分代码不变,所以循环体内代码变为:

 range(rows):2     3         mapx.itemset((i,j)           mapx的值保持不变4         mapy.itemset((i,rows-1-i)    mapy的值调整为总行数-1-当前行号

(三)绕y轴翻转

重映射法对图像绕y轴翻转,表明mapx的值调整为总行数-1-当前列号,mapy的值保持不变,所以循环体内代码变为:

 range(cols): mapx的值调整为总列数-1-当前列号mapy的值保持不变

(四)绕x轴y轴翻转

重映射也能实现图像绕x轴和y轴的同时翻转,只需将前两个部分合并,使mapx的值调整为总行数-1-当前列号,mapy的值调整为总行数-1-当前行号。例程如下:

] 5 mapx=np.zeros(img.shape[:2],np.float32) 6 mapy=np.zeros(img.shape[:2 9         mapx.itemset((i,1)">10         mapy.itemset((i,rows-1-i)   mapy的值调整为总行数-1-当前行号15 cv2.destroyAllwindows()

执行后结果如下所示,可以看到,实现了图像的绕x轴和y轴翻转重映射过程。

(五)x轴、y轴互换

重映射中,x轴、y轴互换表明,mapx的值变为所在行的行号,mapy的值变为所在列的列号。

但当行数和列数不一致时,行或列无法完成映射的部分就被处理为0。示例代码如下:

使用函数cv2.remap()实现图像绕x轴和y轴的互换 6 mapx=np.zeros(img.shape[:2 7 mapy=np.zeros(img.shape[:2 8  9     10         mapx.itemset((i,i)    mapx的值变为所在行的行号11         mapy.itemset((i,j)    mapy的值变为所在列的列号12 rst=16 cv2.destroyAllwindows()

结果如图:

可以看到,列数多于行数的部分被置为0(黑色)。

(六)图像的缩放

重映射提供了cv2.remap()函数能够实现图像的放大或缩小。处理图像后,可以将图像固定在围绕其中心的某个区域。

下面例程中,x轴和y轴均缩小为原来的0.25-0.75倍之间。

 9         if 0.25*cols < i < 0.75*cols and 0.25*rows < i < 0.75*rows:10             在目标图像的x轴(0.25-0.75)倍之内生成缩小图像11             mapx.itemset((i,2*(j-0.25*cols)+0.512             在目标图像的y轴(0.25-0.75)倍之内生成缩小图像13             mapy.itemset((i,2*(i-rows*0.25)+0.514         else:15             不在上述区域的点都取(0,0)坐标点的值16             mapx.itemset((i,0)17             mapy.itemset((i,1)">18 rst=cv2.remap(img,cv2.INTER_liNEAR)   图像缩放重映射19 cv2.imshow(20 cv2.imshow(21 22 cv2.destroyAllwindows()
图像缩放重映射结果如下:

这次内容就分享到这里了,下次继续更新第5章 图像阈值处理,希望与各位老师和小伙伴们交流学习~

 

总结

以上是内存溢出为你收集整理的【图像处理】OpenCV+Python图像处理入门教程(四)几何变换全部内容,希望文章能够帮你解决【图像处理】OpenCV+Python图像处理入门教程(四)几何变换所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1189687.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-03
下一篇 2022-06-03

发表评论

登录后才能评论

评论列表(0条)

保存