1 理论基础
考虑如图1所示的一个变换,即将点P经过一个运算映射f映射成点Q。下面解释如果现在已知了P和Q的坐标,应该如何求出这个变换f
图1
写成矩阵形式
二维坐标的变化用三维矩阵的原因是要增加一个偏移量t的维度,否则t无法表现在映射关系f中。为了更深刻地理解第三维度,将其和线性变换作对比。线性变换的特点是:
①变换前后,直线仍然是直线
②变换前后,原点位置不变。
给出线性变换的变换矩阵:
将(0,0)代入显然原点位置不变。将
=(1,0)以及
=(0,1)代入可以得到一组新的由变换矩阵完全决定的基底,因此线性变换就是保持原点位置不变,将两条坐标轴(基底)进行变换,得到一个变换后新的坐标轴,原坐标系所有点被这个变换矩阵映射到新坐标系的对应点,而加入了第三维度偏移量之后的变换过程就可能使坐标原点发生平移,因此可能涵盖更多的变换,图3总结了三维度变换的可能情况。
图2 该图来源网络
2 算法实现
在OpenCV中,可使用cv2.warpAffine()进行操作。其中的参数Matrix就是变换矩阵,不过这里用户提供给cv2.warpAffine()的变换矩阵只要是
一个2×3的矩阵即可,也就是包含以下参数的矩阵:
因为所有变换矩阵的第三行都是确定的,该方法可以自动添加。
下面进行测试检验:
import cv2
import numpy as np
img = cv2.imread(r'C:\Users\91398\Desktop\test.jpg',1)
imgHeight = img.shape[0]
imgWidth = img.shape[1]
mat = np.float32([[1,0,0],[0,1,0]])
dstImg = cv2.warpAffine(img,mat,(imgWidth,imgHeight))
cv2.imshow('src.jpg',dstImg)
cv2.waitKey(0)
cv2.destroyAllWindows()
这个代码段给出的就是原图像如图3(i),这点可以从2×3的变换矩阵系数看到。现在对其逆时针翻转90°,修改mat参数即可,得到图3(ii)可以发现其完全变黑,观察算法理论知,这是因为整个图片被旋转到了画布之外。对旋转90°的变换矩阵增加一点y分量,也即旋转后再将y轴平移一个距离,可看到图像出现,这也证明了之前的黑色是因为图像出现在画布外。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END