几何变换大致分为仿射变换、投影变换、极坐标变换
完成几何变换需要两个独立的算法过程:
1、一个用来实现空间坐标变换的算法,用它描述每个像素如何从初始位置移动到终止位置
2、一个插值算法完成输出图像的每个像素的灰度值
一、仿射变换
二维空间的仿射变换可以描述为:
改写为矩阵乘法的表示方式:
右边3x3的矩阵就是仿射变换矩阵一般形式,根据不同的变换,比如平移、旋转等等,仿射变换矩阵的值是不一样的。
1、平移
假设空间坐标
先沿 轴平移 ,在沿 轴平移 ,则变换后的坐标为 ,仿射变换矩阵为:
其中,若
,表示向 轴负方向平移,若 ,表示向 轴正方向平移。
2、缩放
二维空间坐标
以任意一点 为中心在水平方向和垂直方向上分别缩放 和 倍,缩放后坐标为 ,通俗来讲就是缩放后的坐标离中心点的水平距离变为原坐标离中心点水平距离的 倍。
当
为原点 时,缩放变换可以表示为:
当
为任意点时,变换过程理解为,先将中心点平移到原点,再以原点为中心进行缩放,然后移回到原来的中心点。缩放变换表示为:
注意:等式右边的运算应该从右往左看
3、旋转
如图,假设坐标
绕着原点顺时针旋转 ,假设 到原点的距离为 ,则
由上述方程解得:
同理可得当坐标 绕着原点顺时针旋转 , ,即把顺时针情况下的 改为
所以顺时针绕原点
旋转变换的矩阵表示为:
如果
绕任意一点 顺时针旋转 ,坐标变换表示为:
二、计算仿射变换矩阵
1、解方程法
已知变换前的位置坐标和变换后的位置坐标,计算仿射矩阵,仿射矩阵有6个未知数,需要6个方程,所以需要3组对应位置的坐标,opencv提供的函数cv2.getAffineTransform(src,dst)
代码示例如下:
import cv2import numpy as npsrc = np.array([[0,0],[200,0],[0,200]],np.float32) #变换前的坐标,坐标值必须为32位浮点型dst = np.array([[0,0],[100,0],[0,100]],np.float32) #变换后的坐标,坐标值必须为32位浮点型A = cv2.getAffineTransform(src,dst) #计算仿射变换矩阵
2、矩阵法
使用矩阵相乘的方法计算仿射矩阵,必须知道基本的仿射变换步骤,比如先缩放后平移,遵循等式右边的运算应该从右往左看的原则,则变换的矩阵为:
特殊情况:如果是等比例缩放,缩放和旋转位置可以互换,也就是如果以点
为中心先进行缩放,然后顺时针旋转 ,等价于先进行顺时针旋转 在进行缩放处理,对于这种等比例缩放的仿射变换,opencv提供函数cv2.getRotationMatrix2D(center,angle,scale)计算仿射变换矩阵。
center:变换中心的坐标
angle:逆时针旋转的角度,如果为负数,则为顺时针,单位为角度,不是弧度
scale:等比例缩放系数
三、插值算法
可以将图像理解为一个二维函数
,水平方向为轴,垂直方向为 轴,原点在矩阵的左上角。
已知输入图像的坐标
和输出图像的坐标 的空间变换关系,且已知输入图像函数 ,我们要计算输出图像函数 ,和 需要手动设置的。
比如,我们要放大图像两倍, 仿射变换后的坐标为 , ,但是 无法得知,或者反过来想,要想得到 ,必须知道 , 而 可以通过四个相邻的整数坐标 、 、 、 估算出来,也就是我们要讲的插值算法。
总的来说就是输出图像的坐标
通过逆映射回坐标,如果在原输入图像范围内,且坐标值为非整数,则可以用插值算法计算此处的函数值。如果在原输入图像矩阵范围外面,就不能使用插值算法,使用预先设置的常数即可。
所以问题转化为,如何利用输入图像已知的整数坐标处的函数值估算非整数坐标处的函数值
1、最近邻插值
对于非整数坐标
,他的四个相邻整数坐标为 、 、 、 ,最近邻插值就是从它的四个相邻整数坐标找出离它最近的坐标的值来代替它的值
缺点:图像放大处理后明显出现锯齿状外观
2、双线性插值(最常用)
要估计输入图像非整数坐标
的值,分为三个步骤
第一步:先用线性关系估计输入图像中
的值
第二步:同理用线性关系估计输入图像中
的值
第三步:根据前两步得到的值,用线性关系估计输入图像中
的值
opencv提供了cv2.warpAffine(src,M,dsize,flags,bordMode, borderValue)完成几何变换
src:输入图像矩阵
M:2行3列的仿射变换矩阵
dsize: 二元元组(宽,高),代表输出图像大小
flags: 插值法 INTER_NEAREST、INTER_LINEAR(默认)
bordMode: 填充模式,默认BORDER_CONSTANT
bordValue: 当填充模式为BORDER_CONSTANT时的填充值
如果觉得《matlab 通过矩阵变换使图像旋转平移_opencv图像处理——几何变换》对你有帮助,请点赞、收藏,并留下你的观点哦!