几何变换的可以分为等距变换、相似变换、仿射变换和投影变换。在很多书籍中把等距变换、相似变换都称为仿射变换,常见的仿射变换包括平移、旋转、缩放、翻转、斜切等方法。
- 等距变换:图像中的长度、面积不变,典型的等距变换是 平移、旋转。
- 相似变换:图像中的长度比、夹角、虚圆点不变,相似变换是在等距变换的基础上进行了缩放,典型的相似变换是 缩放。
- 仿射变换:图像中的平行关系、面积比、共线线段或平行线段的长度比、矢量的线性组合不变,仿射变换是旋转和非均匀缩放的复合,典型的仿射变换是 斜切。
- 投影变换:图像中的共点、共线、相交、相切、拐点的关系不变,,投影变换是在仿射变换基础上进行的非线性缩放,典型的投影变换是 透视。
仿射变换(affine)的特点是原始图像中的平行关系和线段长度比例关系保持不变。
OpenCV 中的图像以多维数组描述,通过仿射变换变换为另一个多维数组(转换图像)。
仿射变换中的校正图像在二维空间中完成,在几何上定义为一个线性变换接一个平移变换。
仿射变换由以下公式描述:
OpenCV 提供了 cv2.warpAffine 函数实现仿射变换的操作。
仿射变换矩阵 MA 中有 6 个未知参数,cv2.getAffineTransform 根据图像中不共线的 3 个点在变换前后的对应位置坐标,构造 6元一次方程组即可求出仿射变换矩阵 MA。cv2.warpAffine 再用变换矩阵 MA 计算得到变换后的图像。
基本例程:1.33 图像的仿射变换
# 1.33 仿射变换: 平移、镜像、旋转 (cv2.warpAffine)
img = cv2.imread("../images/imgB2.jpg") # 读取彩色图像(BGR)
rows, cols, ch = img.shape
pts1 = np.float32([[50, 50], [200, 50], [50, 200]]) # 初始位置
pts2 = np.float32([[50, 100], [200, 50], [100, 250]]) # 终止位置
MA = cv2.getAffineTransform(pts1, pts2) # 计算 2x3 变换矩阵 MA
dst = cv2.warpAffine(img, MA, (cols, rows)) # 实现仿射变换
plt.figure(figsize=(9,6))
plt.subplot(121), plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)), plt.title("Original")
plt.subplot(122), plt.imshow(cv2.cvtColor(dst, cv2.COLOR_BGR2RGB)), plt.title("warpAffine")
plt.show()
(本节完)