仿射变换是一种仅在二维平面中发生的几何变形,变换之后的图像仍然可以保持直线的 “平直性” 和 “平行性”,也就是说原来的直线变换之后还是直线,平行线变换之后还是平行线。图像平移和图像旋转是常见的放射变换。
OpenCV通过cv2.warpAffine()
方法实现放射变换效果,其语法如下:
dst = cv2.warpAffine(img, M, dsize)
参数
平移就是让图像中所有像素同时沿着水平或垂直方向移动。在平移的操作中,我们需要把M设置为以下格式实现平移操作。
M = [[1, 0, 水平移动的距离], [0, 1, 垂直移动的距离]]
若水平移动的距离为正数,图像会向右移动,若为复数,图像会向左移动;若垂直移动的距离为正数,图像会向下移动,若为负数,图像会向上移动。
import cv2
import numpy as np
# 读取图像
img = cv2.imread("curve.jpg")
# 获取图像的长宽和通道数
height, width, channel = img.shape
# 设置平移仿射矩阵,示例是向下平移50个像素
M1 = np.float32([[1, 0, 0], [0, 1, 50]])
# 进行仿射变换
new_img = cv2.warpAffine(img, M1, (width, height))
cv2.imwrite("down_curve.jpg", new_img)
curve.jpg
down_curve.jpg
图像旋转也是通过 M 矩阵来实现,但是得出这个矩阵需要复杂的运算,而OpenCV提供了getRotationMatrix2D()
方法来自动计算出旋转图像的 M 矩阵,其语法如下:
M = cv2.getRotationMatrix2D(center, angle, scale)
参数
import cv2
import numpy as np
# 读取图像
img = cv2.imread("curve.jpg")
# 获取图像的长宽和通道数
height, width, channel = img.shape
cx = int(width/2)
cy = int(height/2)
center = (cx, cy)
# 设置旋转仿射矩阵,示例是顺时针旋转3度
M2 = cv2.getRotationMatrix2D(center=center, angle=-3, scale=1.0)
# 进行仿射变换
new_img = cv2.warpAffine(img, M2, (width, height))
cv2.imwrite("rot_curve.jpg", )
curve.jpg
rot_curve.jpg
日常学习记录,一起交流讨论吧!侵权联系~