0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

OpenCV筑基之图像的仿射变换方法总结

OpenCV学堂 来源:Java与Android技术栈 2024-03-19 11:11 次阅读

1. 几何变换

图像的几何变换是指将一幅图像中的坐标位置映射到另一幅图像中的新坐标位置,其实质是改变像素的空间位置,估算新空间位置上的像素值。几何变换不改变图像的像素值,只是在图像平面上进行像素的重新安排。

以下是常用的几种几何变换:

旋转:将图像旋转指定角度。

缩放:按缩放因子调整图像大小,使其变大或变小。

平移:将图像从当前位置移动到新位置。

错切:沿特定轴倾斜图像。

仿射变换:一个更广泛的类别,包括单个变换中的缩放、旋转、错切和平移。

透视变换:此变换模拟 3D 空间中的透视效果,允许进行更复杂的操作,例如校正由摄像机角度引起的扭曲。

几何变换通常使用数学函数和变换矩阵来实现。这些矩阵定义了原始图像中的每个像素如何映射到转换图像中的新位置。

2. 仿射变换

2.1 仿射变换

图像处理中的仿射变换是指对图像进行一次线性变换和平移,将其映射到另一个图像空间的过程。仿射变换可以保持图像的“平直性”,即直线经过仿射变换后依然为直线,平行线经过仿射变换后依然为平行线。

通常,使用 2x3 大小数组 M 来进行仿射变换。数组由两个矩阵 A、B 组成,其中矩阵 A(大小为2x2)用于矩阵乘法,矩阵 B(大小为2x1)用于向量加法。

wKgaomX5AsOAfjBZAABsFs4rUq4912.jpg

其中:

wKgaomX5AqeAO0T8AABQx1G2nA0780.jpg

由于缩放和旋转是通过矩阵乘法来实现,平移是通过矩阵加法来实现的,将这几个操作都用一个矩阵实现所以构造出上面的 2x3 矩阵 M。

仿射变换是从二维坐标到二维坐标之间的线性变换,且为了保持二维图像的“平直性”和“平行性”。我们需要引入齐次坐标的概念,最终得到的齐次坐标矩阵表示形式为:

wKgaomX5AtyATZyWAAAT3sWPxmg170.jpg

2.2 齐次坐标

在数学里,齐次坐标(homogeneous coordinates),或投影坐标(projective coordinates)是指一个用于投影几何里的坐标系统,如同用于欧氏几何里的笛卡儿坐标一般。齐次坐标可让包括无穷远点的点坐标以有限坐标表示。使用齐次坐标的公式通常会比用笛卡儿坐标表示更为简单,且更为对称。

引入齐次坐标的目的是为了更好的表示无限远(infinity)的坐标的概念,在欧式空间中,无限大或者无限小的坐标的并不存在,不能用数值表示。数学家 August Ferdinand Möbius(1) 提出了齐次坐标系,采用 N+1 个量来表示 N 维坐标。

例如,在二维齐次坐标系中,我们引入一个量 w,将一个二维点 (x,y) 表示为 (X,Y,w) 的形式,其转换关系为

wKgaomX5AvGAVG62AAAJsCzn6j4959.jpg

其中,w 可以为任意值。

在笛卡尔坐标系中以(1,2)为例,在齐次坐标系中可以用(1,2,1)表示,也可以用(2,4,2)表示,还可以用 (4,8,4),(8,16,8)...表示,即 (k,2k,k),k∈ R 这些点都映射到欧式空间中的一点,即这些点具有 尺度不变性(Scale Invariant),是“齐性的”(同族的),所以称之为齐次坐标

“齐次坐标表示是计算机图形学的重要手段之一,它既能够用来明确区分向量和点,同时也更易用于进行仿射(线性)几何变换。”——出自《计算机图形学(OpenGL版)》的作者 F.S. Hill Jr.

通过齐次坐标还可以证明两条平行线可以相交,非常有意思。

3. 仿射变换中常见的变换形式

OpenCV 提供了 warpAffine() 函数实现仿射变换。它可以用于实现各种图像几何变换,例如平移、缩放、旋转、错切等。

voidwarpAffine(InputArraysrc,OutputArraydst,
InputArrayM,Sizedsize,
intflags=INTER_LINEAR,
intborderMode=BORDER_CONSTANT,
constScalar&borderValue=Scalar());

第一个参数 src: 输入图像,可以是单通道或多通道图像。

第二个参数 dst: 输出图像,与输入图像同类型和大小。

第三个参数 M: 仿射变换矩阵,2x3 的浮点数矩阵。

第四个参数 dsize: 输出图像的大小。

第五个参数 flags: 插值方式,默认值为 INTER_LINEAR,表示使用双线性插值。

第六个参数 borderMode: 边界模式,默认值为BORDER_CONSTANT,表示使用常量值填充边界。

第七个参数 borderValue: 边界填充值,默认值为0。

3.1 平移

图像平移的公式:

wKgaomX5AweAeHwDAAAU0bEeseE553.jpg

下面的代码,分别实现了对图像沿着 x 轴、y 轴进行平移

#include
#include
#include

usingnamespacestd;
usingnamespacecv;

intmain(){
Matsrc=imread(".../girl.jpg");
imshow("src",src);

intwidth=src.cols;
intheight=src.rows;

Matdst;
Matwarp_matrix=(cv::Mat_(2,3)<<1, 0, 400, 0, 1, 0);
    warpAffine(src, dst, warp_matrix, Size(width, height), INTER_LINEAR);
    imshow("Shift along X-axis", dst);

    warp_matrix = (cv::Mat_(2,3)<<1, 0, 0, 0, 1, 400);
    cv::warpAffine(src, dst, warp_matrix, Size(width, height), INTER_LINEAR);
    cv::imshow("Shift along Y-axis", dst);

    waitKey(0);
    return 0;
}
e6a718e0-e59d-11ee-a297-92fbcf53809c.jpg

平移变换.png

3.2 缩放

图像缩放的公式:

wKgZomX5Ax-AU_JvAAATItRNEzQ539.jpg

下面的代码,分别实现了对图像进行0.75和1.25倍的缩放。

#include
#include
#include

usingnamespacestd;
usingnamespacecv;

intmain(){
Matsrc=imread(".../girl.jpg");
imshow("src",src);

intwidth=src.cols;
intheight=src.rows;

//设置缩放比例
floatscale=0.75;

Matdst;
Matwarp_matrix=(cv::Mat_(2,3)<(2,3)<
e6cd8426-e59d-11ee-a297-92fbcf53809c.jpg

缩放变换.png

3.3 旋转

图像旋转的公式:

wKgZomX5AzmAcYaOAAAbuzJJZkA861.jpg

OpenCV 提供了更为简洁的 getRotationMatrix2D() 函数用于生成一个 2x3 的仿射变换矩阵,该矩阵可以用于对图像进行旋转操作。

MatgetRotationMatrix2D(Point2fcenter,doubleangle,doublescale);

第一个参数 center: 图像旋转中心,以像素为单位。

第二个参数 angle: 旋转角度,以度为单位。逆时针方向为正。

第三个参数 scale: 旋转后的图像缩放比例。

下面的代码,展示了以图像的中心作为旋转中心,并且逆时针方向旋转45度。

#include
#include
#include

usingnamespacestd;
usingnamespacecv;

intmain(){
Matsrc=imread(".../girl.jpg");
imshow("src",src);

intwidth=src.cols;
intheight=src.rows;

Pointcenter=Point(width/2,height/2);
doubleangle=45;
doublescale=1.0;
Matdst;
Matwarp_matrix=getRotationMatrix2D(center,angle,scale);
warpAffine(src,dst,warp_matrix,Size(width,height),INTER_LINEAR);
imshow("Rotate",dst);

waitKey(0);
return0;
}
e6e7b5f8-e59d-11ee-a297-92fbcf53809c.jpg

旋转变换.png

3.4 错切

图像错切的公式:

wKgaomX5A1WABBXiAAA6SnIS4IU545.jpg

下面的例子,展示图像的错切。

#include
#include
#include

usingnamespacestd;
usingnamespacecv;

intmain(){
Matsrc=imread(".../girl.jpg");
imshow("src",src);

intwidth=src.cols;
intheight=src.rows;

floata=0.25;
floatb=0.5;

Matdst;
Matwarp_matrix=(cv::Mat_(2,3)<<1, a, 0, b, 1, 0);
    warpAffine(src, dst, warp_matrix, Size(width, height), INTER_LINEAR);
    imshow("Shearing", dst);

    waitKey(0);
    return 0;
}
e7135f46-e59d-11ee-a297-92fbcf53809c.jpg

错切变换.png

4. 总结

图像仿射变换是一种简单而有效的图像几何变换方法,在图像处理和计算机视觉领域有着广泛的应用。它可以用于图像矫正、增强、配准、合成、目标识别和跟踪等多种任务。




审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 图像处理
    +关注

    关注

    27

    文章

    1288

    浏览量

    56709
  • 计算机视觉
    +关注

    关注

    8

    文章

    1698

    浏览量

    45964
  • OpenCV
    +关注

    关注

    31

    文章

    634

    浏览量

    41329

原文标题:OpenCV筑基之图像的仿射变换

文章出处:【微信号:CVSCHOOL,微信公众号:OpenCV学堂】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Labview 竟然没有仿变换函数???

    是这样的 ,最近我要对一个二维数组(元素浮点型的XY坐标)。 结果不论是谷歌 还是其他搜索引擎 都无法在找到 NI里面的仿变换函数。这也太扯了吧。。。NI如此牛X的公司 为啥会没有这个函数呢?是我没找到吗? 还是真的没有。。。
    发表于 01-23 14:55

    红外对方法+Pulse Sensor方法总结

    红外对方法+Pulse Sensor方法总结刚开始用的红外对做的:功能://硬件组成://MSP430G2553单片机+DS18B20温
    发表于 11-29 06:16

    求助,算能的sdk仿变换不能设置填充方式吗?

    我想让仿变换后的图片的空白区域填充为黑色,但是bmcv_image_warp_affine接口没有相关设置,并且它的填充方式像是重复最后一个元素
    发表于 09-18 06:23

    使用仿不变特征的遥感图像自动配准

    提出一种仿不变特征的构造方法对航空图像序列进行全自动配准。仿不变特征基于
    发表于 04-03 08:41 27次下载

    一种多传感器遥感图像的配准方法

    提出了一种对多传感器遥感图像进行配准的新方法. 应用数学形态学的方法提取源图像的结构特征,并在此基础上选择图像的相关配准点. 利用
    发表于 07-13 09:24 16次下载

    基于广义典型相关分析的仿不变特征提取方法

    基于广义典型相关分析的仿不变特征提取方法:该文结合广义典型相关分析(GCCA)理论,提出了一种新的图像仿
    发表于 10-29 12:52 17次下载

    基于角点的红外与可见光图像自动配准方法

    基于角点的红外与可见光图像自动配准方法摘要:针对红外图像与可见光图像的自动配准问题,提出了一种基于图像角点特征以及
    发表于 05-12 09:11 29次下载

    基于仿变换模型的图像跟踪系统的实现

    文中设计研制了一种新型的基于仿变换模型的实时图像跟踪系统。本跟踪系统已经通过实践检验,能够稳定的、准确的、快速的跟踪目标。并且系统有很大的升级潜力,除了能够满足
    发表于 08-29 14:54 19次下载
    基于<b class='flag-5'>仿</b><b class='flag-5'>射</b><b class='flag-5'>变换</b>模型的<b class='flag-5'>图像</b>跟踪系统的实现

    仿变换综合示例_《OpenCV3编程入门》书本配套源代码

    OpenCV3编程入门》书本配套源代码:仿变换综合示例
    发表于 06-06 15:39 5次下载

    OpenCV3编程入门-源码例程全集-仿变换综合示例

    OpenCV3编程入门-源码例程全集-仿变换综合示例,感兴趣的小伙伴们可以瞧一瞧。
    发表于 09-18 16:55 0次下载

    采用仿不变矩的谐振接地系统故障选线方法研究

    采用仿不变矩的谐振接地系统故障选线方法研究_许晔
    发表于 01-04 16:57 0次下载

    仿重投影混合虚实注册方法_雍玖

    仿重投影混合虚实注册方法_雍玖
    发表于 03-19 19:04 0次下载

    如何利用TI DSP实现仿扭曲

    医疗保健和医学研究近年来越来越多地使用医学图像。这种用法通常涉及三维(3D)数据集的可视化,以及准确地将不同图像中的信息关联起来用于诊断、治疗和基础科学。图像配准和体绘制操作通常涉及图像
    发表于 05-22 09:06 2次下载
    如何利用TI DSP实现<b class='flag-5'>仿</b><b class='flag-5'>射</b>扭曲

    总结一下OpenCV遍历图像的几种方法

    在图形处理中,遍历每个像素点是最基本的功能,是做算法的基础,这篇文章来总结一下OpenCV遍历图像的几种方法
    的头像 发表于 01-18 15:08 1721次阅读

    OpenCV图像的透视变换

    透视变换是一种非线性变换,它可以将一个二维坐标系中的点映射到三维坐标系中的点,然后再将其投影到另一个二维坐标系中的点。透视变换可以改变图像中的形状,并可以模拟真实世界中的透视效果。
    的头像 发表于 03-15 09:51 926次阅读
    <b class='flag-5'>OpenCV</b><b class='flag-5'>筑</b><b class='flag-5'>基</b><b class='flag-5'>之</b><b class='flag-5'>图像</b>的透视<b class='flag-5'>变换</b>