几何变换的概念与应用
几何变换是将一幅图像中的坐标位置映射到另一幅图像中的新坐标位置,改变图像的几何位置、几何形状、几何尺寸等几何特征。其实质是改变像素的空间位置,估算新空间位置上的像素值。包括图像的平移变换、镜像变换、转置变换、旋转变换、图像缩放。
例如在车牌识别的预处理中,首先就需要对倾斜的车牌进行矫正,然后再进行其他处理。
图像集合变换的表达式为(x,y)=T{(u,v)}
平移、旋转的原理
对于缩放、平移可以以图像坐标原点(图像左上角为原点)为中心变换,这不用坐标系变换,直接按照一般形式计算即可。而对于旋转和偏移,一般是以图像中心为原点,那么这就涉及坐标系转换。
平移不改变图像的大小,只是改变了图像的位置,就是将所有坐标分别加上指定的垂直偏移量。
x' = x + Δx
y' = y + Δy
旋转需要将图像的坐标进行转换。转换成以中心点为原点的数学坐标系。过程为
由输入图像的坐标系转化为数学坐标系。
通过数学旋转坐标系计算指定像素旋转后的坐标。
由旋转坐标系转换为输出图像的坐标系。
代码实现平移、旋转操作
def trans(img):
'''
Task02 几何变换
:return:
'''
cols = int(img.shape[1])
rows = int(img.shape[0])
m_x = 100 # x轴平移100
m_y = 200 # y轴平移200
affine_translation = np.array([[1, 0, m_x], [0, 1, m_y]], np.float32) # 仿射变换矩阵
translation = cv2.warpAffine(img, # 进行几何变换的图片
affine_translation, # 几何变换的关系矩阵
(cols, rows), # 进行变换的中心坐标
borderValue=[125,125,125] # 边界填充的颜色
)
#在平移的基础上 绕图像的中心旋转
center_point = (cols/2,rows/2) # 旋转中心点
angle = 30 # 旋转角度
scale = 1 # 图像缩放因子即缩放比例
affine_rotation = cv2.getRotationMatrix2D(center_point, angle, scale) # 仿射变换矩阵
rotation = cv2.warpAffine(translation, # 进行几何变换的图片
affine_rotation, # 几何变换的关系矩阵
(cols, rows), # 进行变换的中心坐标
borderMode=1, # 边界填充的样式
borderValue=125 # 边界填充的颜色
)
print("shape1 : ",translation.shape)
print("shape2 : ",rotation.shape)
cv2.imshow('translation', translation)
cv2.imshow('rotation', rotation)
cv2.waitKey(0)
cv2.destroyAllWindows()
return
if __name__ == "__main__":
img = cv2.imread('./xiabang.jpg', cv2.IMREAD_UNCHANGED)
print('Original Dimensions : ',img.shape)
trans(img)