利用OpenCV的函数warpAffine()做图像的仿射变换【实现图像的平移、缩放、旋转、翻转等操作】

图像的仿射变换是指在直角坐标系中将一个二维坐标转换到另外一个二维坐标的过程。
仿射变换是一种线性变换,可以表示为矩阵相乘与平移过程。
通过仿射变换这种线性变换操作,可以实现图像的平移、缩放、翻转、旋转等变换。

设原始图像的坐标(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++示例代码运行结果如下:

在这里插入图片描述

在这里插入图片描述

延伸阅读:
利用OpenCV的仿射变换函数warpAffine()实现图像的亚像素级平移

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值