博客
关于我
OpenC学习笔记之十四——仿射变换
阅读量:798 次
发布时间:2023-04-15

本文共 2804 字,大约阅读时间需要 9 分钟。

仿射变换入门与实践

仿射变换是一种在计算机视觉中常用的图像变换方法,广泛应用于图像的仿射重建、投影、配准等场景。通过本文,你将逐步了解仿射变换的基本概念、实现方法以及实际应用案例。


一、仿射变换概述

仿射变换是一种线性变换加上平移的综合操作,能够保持图像的平行性和直线性。与旋转、缩放、平移等单一变换不同,仿射变换能够更灵活地调整图像的形状和位置。

仿射变换的核心可以用一个2×3的矩阵表示,形式如下:

| a  b  c || d  e  f || 0  0  1 |

其中,abde是线性变换矩阵,cf是平移向量。通过改变矩阵中的参数,可以实现旋转、缩放、平移等多种变换效果。


二、仿射变换函数

在OpenCV库中,提供了两个主要函数来实现仿射变换:

  • warpAffine 函数

    主要用于图像的仿射重建或变换。该函数接收以下参数:

    • src:源图像。
    • dst:目标图像。
    • M:仿射变换矩阵。
    • dsize:目标图像的尺寸。
    • flags:插值方法(默认为线性插值)。
    • borderMode:边界模式(默认为常数边界)。
  • getRotationMatrix2D 函数

    主要用于计算旋转矩阵。该函数接收以下参数:

    • center:旋转中心。
    • angle:旋转角度。
    • scale:缩放系数。

  • 三、仿射变换函数的实现细节

    1. warpAffine 函数详解

    warpAffine 函数的主要作用是将源图像按照指定的仿射变换矩阵重建到目标图像上。以下是函数的核心实现逻辑:

    • 线性变换:使用矩阵 M 对源图像进行线性变换。
    • 平移变换:将变换后的图像在平移后与目标图像重合。
    • 插值方法:根据指定的插值方式(如线性插值、最近邻插值等),处理图像边缘的填充问题。

    2. getRotationMatrix2D 函数详解

    getRotationMatrix2D 函数用于计算旋转矩阵,适用于基于仿射变换的旋转操作。函数的核心逻辑包括:

    • 坐标变换:将旋转中心转换为原点坐标系。
    • 旋转矩阵计算:根据旋转角度生成旋转矩阵。
    • 坐标逆变换:将旋转后的图像恢复到原来的坐标系。

    四、仿射变换函数的应用示例

    1. 仿射变换的实现代码

    以下是一个使用 warpAffinegetRotationMatrix2D 实现仿射变换的代码示例:

    #include 
    #include
    using namespace std;using namespace cv;/// 函数主程序int main(int argc, char** argv) { // 加载源图像 Mat src = imread("harris.jpg", 1); // 创建目标图像,尺寸与源图像一致 Mat warp_dst = Mat::zeros(src.rows, src.cols, src.type()); // 定义仿射变换三点对应关系 Point2f srcTri[] = { Point2f(0, 0), // 三角形顶点1 Point2f(src.cols - 1, 0), // 三角形顶点2 Point2f(0, src.rows - 1) // 三角形顶点3 }; Point2f dstTri[] = { Point2f(src.cols*0.0, src.rows*0.33), // 目标顶点1 Point2f(src.cols*0.85, src.rows*0.25), // 目标顶点2 Point2f(src.cols*0.15, src.rows*0.7) // 目标顶点3 }; // 计算仿射变换矩阵 Mat warp_mat = getAffineTransform(srcTri, dstTri); // 应用仿射变换 warpAffine(src, warp_dst, warp_mat, warp_dst.size()); // 定义旋转中心和参数 Point center(warp_dst.cols/2, warp_dst.rows/2); double angle = -50.0; double scale = 0.6; // 计算旋转矩阵 Mat rot_mat = getRotationMatrix2D(center, angle, scale); // 应用旋转变换 warpAffine(warp_dst, warp_dst, rot_mat, warp_dst.size()); // 显示结果 namedWindow("source", CV_WINDOW_AUTOSIZE); imshow("source", src); namedWindow("warp", CV_WINDOW_AUTOSIZE); imshow("warp", warp_dst); namedWindow("warp_rotate", CV_WINDOW_AUTOSIZE); imshow("warp_rotate", warp_dst); // 等待用户退出程序 waitKey(0); return 0;}

    2. 代码解释与效果展示

    • 代码结构

      • 加载源图像 src
      • 创建目标图像 warp_dst,尺寸与源图像一致。
      • 定义源图像和目标图像的三点对应关系,使用 Point2f 类表示点坐标。
      • 计算仿射变换矩阵 warp_mat,并应用 warpAffine 函数进行仿射变换。
      • 计算旋转矩阵 rot_mat,并对变换后的图像进行旋转。
      • 显示源图像、仿射变换结果和旋转变换结果。
    • 效果展示

      • 仿射变换可以实现图像的非均匀缩放、剪切和平移。
      • 组合仿射变换和旋转,可以实现更复杂的图像变换。

    五、仿射变换的实际应用

    仿射变换在图像处理中的应用场景包括:

  • 图像配准:通过仿射变换将两幅图像的特定区域对齐。
  • 图像投影:将图像投影到特定的坐标系中。
  • 图像增强:通过仿射变换进行图像的非均匀缩放和剪切。
  • 图像修正:用于图像的仿射优化或纠正。

  • 六、总结

    仿射变换是一种强大的图像变换工具,其核心在于通过仿射矩阵实现图像的线性变换和平移操作。在OpenCV库中,warpAffinegetRotationMatrix2D 函数为我们提供了实现仿射变换的便捷工具。通过合理设计仿射矩阵和旋转矩阵,可以实现丰富的图像变换效果。

    如果你对仿射变换有更多疑问,或者需要具体的实现案例,欢迎在评论区留言交流!

    转载地址:http://hwgfk.baihongyu.com/

    你可能感兴趣的文章
    mysql5.7命令总结
    查看>>
    mysql5.7安装
    查看>>
    mysql5.7性能调优my.ini
    查看>>
    MySQL5.7新增Performance Schema表
    查看>>
    Mysql5.7深入学习 1.MySQL 5.7 中的新增功能
    查看>>
    Webpack 之 basic chunk graph
    查看>>
    Mysql5.7版本单机版my.cnf配置文件
    查看>>
    mysql5.7的安装和Navicat的安装
    查看>>
    mysql5.7示例数据库_Linux MySQL5.7多实例数据库配置
    查看>>
    Mysql8 数据库安装及主从配置 | Spring Cloud 2
    查看>>
    mysql8 配置文件配置group 问题 sql语句group不能使用报错解决 mysql8.X版本的my.cnf配置文件 my.cnf文件 能够使用的my.cnf配置文件
    查看>>
    MySQL8.0.29启动报错Different lower_case_table_names settings for server (‘0‘) and data dictionary (‘1‘)
    查看>>
    MYSQL8.0以上忘记root密码
    查看>>
    Mysql8.0以上重置初始密码的方法
    查看>>
    mysql8.0新特性-自增变量的持久化
    查看>>
    Mysql8.0注意url变更写法
    查看>>
    Mysql8.0的特性
    查看>>
    MySQL8修改密码报错ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
    查看>>
    MySQL8修改密码的方法
    查看>>
    Mysql8在Centos上安装后忘记root密码如何重新设置
    查看>>