几何变换指将图像的集合信息进行变换来获取新图像的变换方法,包括平移变换、放缩变换、旋转变换、镜像变换、剪切变换、透视变换等
几何变换的本质是矩阵运算。设空间中一个点的笛卡尔坐标是(x,y,z),基于某个条件将其变换到(x`,y`,z`),则几何变换公式可表示为如图所示:
图像由像素点构成,对单个点的变换可以推广到对m个点的变换,从而实现对图像的几何变换。
平移变换是一种刚体变换,指将图像沿某方向平移来获取新图像的变换方法。
设空间中一个点的笛卡尔坐标是(x,y,z),基于平移向量(a,b,c)将其平移得到新的坐标(x`,y`,z`),则平移变换公式表示为:
a,b,c称为平移系数,他们共同给构成了平移向量(a,b,c);T称为平移变换矩阵。
import cv2
import matplotlib.pyplot as plt
import numpy as np
import math
#读入图像
srcImg = cv2.imread('D:\picture\pic01.jpg')
image = cv2.cvtColor(srcImg,cv2.COLOR_BGR2RGB)
b,g,r = cv2.split(image) #分离
hp = cv2.merge((b,g,r)) #合并
#平移:右50像素,下30像素
tx,ty = 50,30
affine_arr = np.float32([[1,0,tx],[0,1,ty],[0,0,1]])
res = cv2.warpPerspective(srcImg,affine_arr,(width,height))
plt.figure(figsize=(10,10)) #开始画图
plt.subplot(121),plt.imshow(cv2.cvtColor(srcImg,cv2.COLOR_BGR2RGB)),plt.title('original'),plt.axis('off')
plt.subplot(122),plt.imshow(cv2.cvtColor(res,cv2.COLOR_BGR2RGB)),plt.title('translate'),plt.axis('off')
plt.show()
放缩变换也称为尺度变换,指将图像在某方向按比例放缩来获取新图像的变换方法。放缩变换改变了图片的尺寸,即改变了图像像素点间的距离。放缩变换一般沿坐标轴方向进行,也可分解为沿坐标轴方向进行。
设空间中一个点的笛卡尔坐标是(x,y,z),基于平移向量(a,b,c)将其平移得到新的坐标(x`,y`,z`),则放缩变换公式表示为:
当a=b=c的时候,称为尺度放缩,否则称为拉伸放缩;S称为放缩变换矩阵。
#缩放
a1 = cv2.resize(srcImg,(1080,840))#放大到1080*840像素
a2 = cv2.resize(srcImg,(256,128))#缩小到256*128像素
plt.figure(figsize=(10,10))
plt.subplot(121),plt.axis('off'),plt.title("1080*840")
plt.imshow(cv2.cvtColor(a1,cv2.COLOR_BGR2RGB))
plt.subplot(122),plt.axis('off'),plt.title("256*128")
plt.imshow(cv2.cvtColor(a2,cv2.COLOR_BGR2RGB))
旋转变换是一种刚体变换,指将图像以某点为轴进行旋转来获取新图像的变换方法。
1.一个点绕Z坐标轴旋转
设空间中一个点的笛卡尔坐标是(x,y,z),将该点绕Z坐标轴旋转y角度到达新的坐标(x`,y`,z`),则旋转变换公式可表示为如图:
y为该点绕Z坐标轴旋转的角度,定义为在右手坐标系下从旋转轴正向看原点是顺时针的;Ry称为旋转变换矩阵。
2.一个点绕Y坐标轴旋转
设空间中一个点的笛卡尔坐标是(x,y,z),将该点绕Y坐标轴旋转b角度到达新的坐标(x`,y`,z`),则旋转变换公式可表示为如图:
b为该点绕Y坐标轴旋转的角度,定义为在右手坐标系下从旋转轴正向看原点是顺时针的;Rb称为旋转变换矩阵。
3.一个点绕X坐标轴旋转
设空间中一个点的笛卡尔坐标是(x,y,z),将该点绕X坐标轴旋转b角度到达新的坐标(x`,y`,z`),则旋转变换公式可表示为如图:
a为该点绕X坐标轴旋转的角度,定义为在右手坐标系下从旋转轴正向看原点是顺时a称为旋转变换矩阵。
#逆时针旋转60°,120°
angle1,angle2 = 60,120
height,width = srcImg.shape[:2]
x0,y0 = width//2,height//2
MAR1 = cv2.getRotationMatrix2D((x0,y0),angle1,1.0)
imgR1 = cv2.warpAffine(srcImg,MAR1,(width,height))
plt.figure(figsize=(15,15))
plt.subplot(131),plt.axis('off'),plt.title('origin')
plt.imshow(cv2.cvtColor(srcImg,cv2.COLOR_BGR2RGB))
plt.subplot(133),plt.axis('off'),plt.title('Rotation60°')
plt.imshow(cv2.cvtColor(imgR1,cv2.COLOR_BGR2RGB))
镜像变换是一种刚体变化,包括水平镜像和垂直镜像
1.水平镜像
水平镜像指将图像左半部分和右半部分以图像垂直为中心进行镜像对换来获取新图像的变换方法。设空间中一个点的笛卡尔坐标是(x,y,z),将其水平镜像到新的坐标(x`,y`,z`),则水平镜像变换公式如图:
w为图像的宽度;Mx称为水平镜像变换矩阵。
2.垂直镜像
垂直镜像将图像上半部分和下半部分以图像水平中轴线为中心进行镜像对换来获取新图像的变换方法。 设空间中一个点的笛卡尔坐标是(x,y,z),将其水平镜像到新的坐标(x`,y`,z`),则垂直镜像变换公式如图:
h为图像的高度;My称为垂直镜像变换矩阵
#水平镜像
imgFlip = cv2.flip(srcImg,1)
plt.figure(figsize=(9,6))
plt.subplot(221),plt.axis('off'),plt.title("Original")
plt.imshow(cv2.cvtColor(srcImg,cv2.COLOR_BGR2RGB))
plt.subplot(222),plt.axis('off'),plt.title("Flipped Horizontally")
plt.imshow(cv2.cvtColor(imgFlip,cv2.COLOR_BGR2RGB))
plt.show()