图像的几何变换包括以下几个方面:
导入库
import numpy as np
import matplotlib.pyplot as plt
import cv2 as cv
显示图片函数
def show(img):
if img.ndim == 2:
plt.imshow(img,cmap='gray')
else:
plt.imshow(cv.cvtColor(img,cv.COLOR_RGB2BGR))
plt.show()
图片的剪裁、放大和缩小
#图片剪裁
img = cv.imread('C:\PerfLogs\pc4.jpg')
img_pg = img[1250:1750,300:1000,:]
show(img_pg)
#opencv中自带的resize函数
img2 = cv.resize(img,(500,400))
show(img2)
原图:
剪裁过后:
调整大小:
平移变换
平移矩阵:
#平移变换
M = np.array([
[1,0,100],
[0,1,50]
],dtype=np.float32)#平移矩阵
img2 = cv.warpAffine(img,M,(1333,2003))#原图、偏移矩阵、变换后的图片大小
show(img2)
错切变换
其实错切变换和平移变换的公式是一样的,只不过矩阵的参数不同,可以根据平移变换来考虑错切变换。
#水平错切变换
M = np.array([
[1,0.2,0],
[0,1,0]
],dtype=np.float32)
img3 = cv.warpAffine(img,M,(2333,2203))
show(img3)
#垂直错切变换
M = np.array([
[1,0,0],
[0.3,1,0]
],dtype=np.float32)
img3 = cv.warpAffine(img,M,(2333,2203))
show(img3)
水平错切:
垂直错切:
镜像变换
考虑对称性
#水平镜像变换
Mx = np.array([
[-1,0,930],
[0,1,0]
],dtype=np.float32)
img4 = cv.warpAffine(img,Mx,(3333,2203))
show(img4)
#垂直镜像变换
Mx = np.array([
[1,0,0],
[0,-1,1200]
],dtype=np.float32)
img4 = cv.warpAffine(img,Mx,(1333,2203))
show(img4)
上面的代码是自己写的变换矩阵,然后实现的镜像变换。其实opencv中是有自带的库函数进行镜像变换的。但是实际使用的时候,可能需要根据不同的对称线进行镜像变换,所以学会变换矩阵的做法也是很必要的。
#镜像变换函数
img4 = cv.flip(img ,1)#水平镜像变换
img5 = cv.flip(img ,0)#垂直镜像变换
img6 = cv.flip(img ,-1)#中心镜像变换
show(np.hstack([img4,img5,img6]))
旋转变换
公式推导:
#旋转变换
beta = np.pi / 4.0
M = np.array([
[np.cos(beta),np.sin(beta),0],
[-np.sin(beta),np.cos(beta),0]
],dtype=np.float32)
img5 = cv.warpAffine(img,M,(4333,2203))
show(img5)
opencv自带的库函数进行旋转变换-利用opencv自带的库函数求出变换矩阵
#opencv函数进行旋转变换
h,w,c = img.shape
M2 = cv.getRotationMatrix2D((w//2,h//2),45,1)#中心点、角度、放大还是缩小
img5 = cv.warpAffine(img,M2,(1333,1203))
opencv自带的库函数直接实现旋转变换,但是只能是特殊角度的旋转,例如90°,180°。
img6 = cv.rotate(img,cv.ROTATE_90_CLOCKWISE)
show(img6)
透视变换
所谓的透视变换就是将图片偏向正视角的部分朝向正视角。如下所示:
#透视变换
img = cv.imread('C:\PerfLogs\pp.jpg')
src = np.array([
[210,50],
[610,270],
[650,470],
[150,450]
],dtype=np.float32)#想透视变换的部分,在原图中的四角坐标,左上-右上-右下-左下
dst = np.array([
[150,50],
[650,50],
[650,470],
[150,470]
],dtype=np.float32)#透视变换之后的部分,在生成的图片中的四角坐标,左上-右上-右下-左下
M = cv.getPerspectiveTransform(src,dst)
img2 = cv.warpPerspective(img,M,(1500,1500))
show(img2)