第九篇—仿射变换_热门
哔哩哔哩 2023-05-02 18:03:29
仿射变换
(相关资料图)
仿射变换是指对一个向量进行线性变换,得到另一个向量,变换前后两个向量仍在同一平面上。假设有两个二维向量V和V':
通过线性变换将向量V变为向量V':
将上式展开:
转换为矩阵的乘法:
所以通过矩阵M就可以实现两个向量之间的仿射变换,常见的仿射变换包括:平移、缩放、旋转和翻转。
OpenCV中通过warpAffine()函数实现仿射变换:
仿射变换—平移
对于二维向量V=(x,y)和V'=(x',y'),通过平移变换将V变为V'的操作如下:
转换为矩阵的形式:
代码实现:
结果:
仿射变换—缩放
对于二维向量V=(x,y)和V'=(x',y'),通过缩放变换将V变为V'的操作如下:
转换为矩阵的形式:
代码实现:
结果:
仿射变换—旋转
对于二维向量V=(x,y)和V'=(x',y'),围绕原点将向量V变为向量V'的操作如下:
转换为矩阵的形式:
因为图像的坐标系是以左上角为原点,所以需要对角度theta进行取反,根据三角函数的奇偶性,矩阵M变为:
如果围绕任意点C(a,b)旋转,将变量V变为V'的操作如下:
转换为矩阵的形式:
同理,因为图像的坐标系是以左上角为原点,所以需要对角度theta进行取反,根据三角函数的奇偶性,矩阵M变为:
代码实现:
结果:
为了防止旋转后图片的部分信息被裁剪掉,我们对输出图片的尺寸进行扩充,优化的代码实现如下:
结果:
仿射变换—翻转
翻转包括水平翻转、垂直翻转和镜像翻转,对于二维向量V=(x,y)和V'=(x',y'),通过翻转变换将V变为V'的操作如下:
转换为矩阵的形式:
代码实现:
结果: