图像的仿射变换是指在直角坐标系中将一个二维坐标转换到另外一个二维坐标的过程。
仿射变换是一种线性变换,可以表示为矩阵相乘与平移过程。
通过仿射变换这种线性变换操作,可以实现图像的平移、缩放、翻转、旋转等变换。
设原始图像的坐标(x,y),经过仿射变换后变为(x’,y’),则仿射变换可表示为下面这个式子:
根据上面的式子,我们可以定义仿射变换矩阵M为下面的矩阵:
从上面仿射变换矩阵M的定义式可以看出,它是一个尺寸为2×3的矩阵。
原图像和目标图像之间的变换关系如下:
对于仿射变换矩阵M,我们既可以根据自己的需要自己计算,也可以利用函数getRotationMatrix2D()和函数getAffineTransform()实现仿射变换矩阵的计算。
得到仿射变换矩阵M后,再利用函数warpAffine()实现对图像的仿射变换。
下面介绍上面提到的三个函数。
函数getRotationMatrix2D()可以计算用于图像旋转的的仿射变换矩阵,其原型如下:
Mat cv::getRotationMatrix2D(Point2f center,
double angle,
double scale )
retval=cv.getRotationMatrix2D(center, angle, scale)
参数意义如下:
center—图像旋转的中心。
angle—图像旋转的角度,单位为度,正值代表逆时针旋转。
scale—沿两条轴的缩放比例,可以实现旋转过程中的图像缩放,如果不需要缩放,则这个参数值取1。
函数getAffineTransform()可以通过仿射变换前后像素坐标的对应关系计算仿射变换矩阵,其原型如下:
Mat cv::getAffineTransform(const Point2f src[],
const Point2f dst[] )
retval=cv.getAffineTransform(src, dst)
参数意义如下:
src---原图像中3个像素的坐标。
dst---目标图像中3个像素的坐标。
函数warpAffine()可以根据输入的仿射变换矩阵实现图像的仿射变换,其原型如下:
void cv::warpAffine(InputArray src,
OutputArray dst,
InputArray M,
Size dsize,
int flags = INTER_LINEAR,
int borderMode = BORDER_CONSTANT,
const Scalar & borderValue = Scalar() )
dst=cv.warpAffine(src, M, dsize[, dst[, flags[, borderMode[, borderValue]]]])
参数意义如下:
src—输入图像。
M—尺寸为2×3的仿射变换矩阵。
dsize—输出图像的尺寸。
dst—仿射变换后的图像,与输入图像的数据类型相同,但是尺寸由参数dsize指定。
flags—插值方法和正反变换的标志位。
borderMode—像素边界外推方法的标志,详情见博文 https://www.hhai.cc/thread-178-1-1.html
borderValue—边界填充时的填充值,默认情况下为0。
上面三个函数的综合使用示例的Python代码和C++代码,
请大家访问本博文的原文获取,
本博文的原文链接如下:
https://www.hhai.cc/thread-190-1-1.html
Python示例代码运行结果如下:
C++示例代码运行结果如下: