博客
关于我
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/

    你可能感兴趣的文章
    mysql 内连接、自然连接、外连接的区别
    查看>>
    mysql 写入慢优化
    查看>>
    mysql 分组统计SQL语句
    查看>>
    Mysql 分页
    查看>>
    Mysql 分页语句 Limit原理
    查看>>
    MySql 创建函数 Error Code : 1418
    查看>>
    MySQL 创建新用户及授予权限的完整流程
    查看>>
    mysql 创建表,不能包含关键字values 以及 表id自增问题
    查看>>
    mysql 删除日志文件详解
    查看>>
    mysql 判断表字段是否存在,然后修改
    查看>>
    MySQL 到底能不能放到 Docker 里跑?
    查看>>
    mysql 前缀索引 命令_11 | Mysql怎么给字符串字段加索引?
    查看>>
    mysql 协议的退出命令包及解析
    查看>>
    mysql 取表中分组之后最新一条数据 分组最新数据 分组取最新数据 分组数据 获取每个分类的最新数据
    查看>>
    mysql 四种存储引擎
    查看>>
    MySQL 基础模块的面试题总结
    查看>>
    MySQL 备份 Xtrabackup
    查看>>
    mysql 多个表关联查询查询时间长的问题
    查看>>
    mySQL 多个表求多个count
    查看>>
    mysql 多字段删除重复数据,保留最小id数据
    查看>>