图像几何变换又称图像空间变换,改变了像素的空间位置,但并未改变像素值。很多时候要对图像进行适当的几何变换尽可能地消除图像失真的影响。常见的变换有平移、旋转、镜像等。
根据冈萨雷斯的《数字图像处理_第三版》,仿射变换的一般形式如下:
T是变换矩阵,(v,w)为原坐标,(x,y) 为变换后的坐标,不同的变换对应不同的矩阵,常见的变换矩阵及作用如下表:
笛卡尔坐标系:数学课本中常见的坐标系。以图像中心为原点,水平向右为 X 轴,垂直向上为 Y 轴。
图像坐标系:以图像左上角为原点,水平向右为 X 轴,垂直向下为 Y 轴。
如图:
平移和缩放通常以图像坐标系的原点为变换中心,故不需要进行坐标变换。
偏移、旋转这类变换通常以图像中心点为变换中心,也就是笛卡尔坐标系原点。这就涉及两种坐标系 间的变换了。首先将原图像坐标转换到笛卡尔坐标系下。再进行偏移、旋转等变换,变换矩阵如上表所示。最后将变换后的笛卡尔坐标系下的图像坐标再转换到图像坐标系下。
如上图,AB = N, AC = M。CAB代表图像坐标系,A为原点,AB为x轴,AC为y轴。FDE代表笛卡尔坐标系,DE为x轴,DF是y轴。
在图像坐标系下,D点坐标为(N/2,M/2),一个点的坐标为(x’,y’),转换到笛卡尔坐标(x,y),转换关系为
反之,笛卡尔坐标系到图像坐标系的转换如下:
故旋转(顺时针旋转)的变换形式就为:
import cv2
import numpy as np
src = cv2.imread('1.jpeg')
print(src.shape)
height = src.shape[0]
width = src.shape[1]
#平移,tx = 20, ty = 30
M = np.float32([[1,0,20],[0,1,30]])
print(M.shape)
dst = cv2.warpAffine(src,M,(width, height))
#逆时针旋转90度
M1 = cv2.getRotationMatrix2D(((width-1)/2.0,(height-1)/2.0),90,1)
dst1 = cv2.warpAffine(src,M1,(width,height))
cv2.imshow('img',src)
cv2.imshow('dst',dst)
cv2.imshow('dst1',dst1)
k = cv2.waitKey(0)
if k == ord('s'):
cv2.imwrite('pingyi.png', dst)
cv2.imwrite('xuanzhuan.png', dst)
cv2.destroyAllWindows()