opencv for python图像几何变换

opencv for python图像几何变换学后总结

一、 图像变换简介
1.变换简介:首先图像是由一系列数组构成,对图像进行变换就是对数组进行操作,则需要一个变换数组来进行对原数组的操作从而完成对图像的操作,也就是说变换较为重要的就是通过一些途径来生成一个目标变换数组即矩阵。通过cv2.warpAffine()和cv2.warpPerspective()两个函数可完成几乎所有的图像变换。
2. 需用函数简介:
cv2.warpPerspective(src,M,dsize[,dst[,flags[,borderMode[,borderValue]]]]) →dst
方括号内的参数为可选参数,各参数分别代表:原图像名称,3X3的变换矩阵,目标图像的尺寸,目标图像名称,插值方法的标记,边界处理方式及边界要填充的数组值,该函数返回为目标图像及处理后的图像,其中一般情况下仅使用前三个参数即可,并把返回值赋给目标图像名称即可。
cv2.warpAffine(src,M,dsize[,dst[,flags[,borderMode[,borderValue]]]]) →dst
参数情况与cv2.warpPerspective()函数相同,除了矩阵为3X3的。
以上两函数用来进行变换操作
cv2.resize(src,dsize,[,dst[,fx[,fy[,interpolation]]]])→dst
各参数分别代表原图像、目标图像尺寸,目标图像,缩放因子,插值方法,插值方法有cv2.INTER_CUBIC,cv2.INTER_AREA(缩放时使用),cv2.INTER_LINEAR(默认情况下使用),该函数用来缩放或扩大图像
cv2.getRotationMatrix2D(center,angle,scale)→retval
该函数用来生成旋转变换的变换数组M,即返回值为旋转变换矩阵,三个参数分别为旋转中心的坐标,旋转角度,图像的缩放因子
cv2.getAffineTransform(src,dst)
该函数用来生成仿射变换的变换数组M,即返回值为仿射变换矩阵,两参数分别为原图像和目标图像的相关特征。
cv2.getPerspectiveTransform(src,dst[,solveMethod])
该函数用来生成投射变换的变换数组M,即返回值为透射变换矩阵,参数分别代表原图像,目标图像,和处理方式。
numpy.float32()
用来生成32位的浮点型的多维数组,用于生成易得的矩阵。

二、几类变换的具体说明和操作
1.平移变换:将图像进行平移,即将图像的整体按某个方向移动,图像大小不变,移出的部分消失,缺少的部分在未填充时为空即成黑色。根据x和y方向上的移动像素数来构建移动矩阵,格式如下
其中x,y为方向上移动的像素数,x为正向左移,y为正向下移
其中x,y为方向上移动的像素数,x为正向左移,y为正向下移
操作实现的代码如下:

import cv2
import numpy as np
img=cv2.imread("……/1.jpg")
#第一个参数为图像的完整路径
rows,cols=img.shape[:2]
M=numpy.float32([[1,0,100],[0,1,50]])  #用numpy来生成移动变换矩阵
dst=cv2.warpAffine(img,M,(cols,rows))
cv2.imshow("img",img)
cv2.imshow("dst",dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

2.缩放变换:

import cv2
img=cv2.imread("……/1.jpg")
rows,cols=img.shape[:2] #得到原图像的行数和列数
dst=cv2.resize(img,None,fx=2,fy=2,interpolation=cv2.INTER_LINEAR)
#当使用缩放因子时,尺寸参数用None来表示
#也可使用dst=cv2.resize(img,(2*cols,2*rows),interpolation=cv2.INTER_LINEAR)
#其中坐标需要先列后行,因为列对应的是x轴,行对应的是y轴
cv2.imshow("img",img)
cv2.imshow("dst",dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

3.旋转变换:将图像进行旋转操作,使用函数cv2.getRotationMatrix2D()得到该变换矩阵,使用cv2.warpAffine()来进行变换操作
实现操作的代码如下:

import cv2
img=cv2.imread("……/1.jpg")
rows,cols=img.shape[:2]
M=cv2.getRotationMatrix2D((cols/2,rows/2),45,0.6)
dst=cv2.warpAffine(img,M,(2*cols,2*rows))
cv2.imshow("img",img)
cv2.imshow("dst",dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

4.仿射变换:
简单说,是使图像进行倾斜且在两个方向上任意伸缩的变换,不会改变线共点和点共线、平行线、线段比例的关系,但会改变长度和线之间的夹角,仿射变换属于平面变换、二维坐标上的变换。需有三组原图像及其输出图像的映射点,用cv2.getAffineTransform()来创建矩阵M,再用cv2.warpAffine()来进行仿射变换。
代码实现如下:

import cv2
import numpy as np
img=cv2.imread("……/1.jpg")
rows,cols=img.shape[:2]

pts1=np.float32([[50,50],[200,50],[50,200]])
pts2=np.float32([[10,100],[200,50],[100,250]])
#用numpy生成三组映射点的二维数组
M=cv2.getAffineTransform(pts1,pts2)#用三组映射点生成变换矩阵
dst=cv2.warpAffine(img,M,(cols,rows))
cv2.imshow("img",img)
cv2.imshow("dst",dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

5.透视变换:
透视变换主要用来把三维视角的图像转换为二维正投影图像,透视变换属于空间变换、三维坐标上的变换
代码实现如下:

import cv2
import numpy as np
img=cv2.imread("……/1.jpg")
rows,cols=img.shape[:2]

pts1=np.float32([[56,65],[368,52],[28,387],[389,390]])
pts2=np.float32([[0,0],[300,0],[0,300],[300,300]])
#用numpy生成四组映射点的二维数组
M=cv2.getPerspectiveTransform(pts1,pts2)#用四组映射点生成变换矩阵
dst=cv2.warpPerspective(img,M,(300,300))
cv2.imshow("img",img)
cv2.imshow("dst",dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值