opencv基础篇 ——(九)图像几何变换

        图像几何变换是通过对图像的几何结构进行变换来改变图像的形状、大小、方向或者透视关系。常见的图像几何变换包括缩放、旋转、平移、仿射变换和透视变换等。下面对这些几何变换进行简要介绍:

  1. 矩阵的转置(transpose ): 对于图像来说,它可以将图像的行和列进行交换。转置后图像的高度和宽度也将互换。

  2. 镜像变换(flip):它可以沿水平、垂直或两个方向同时对图像进行翻转。

  3. 缩放(Resize): 缩放是改变图像尺寸大小的一种变换操作。可以按比例缩小或放大图像。在 OpenCV 中,可以使用 cv::resize 函数实现图像的缩放操作。

  4. 旋转(Rotation): 旋转是围绕图像的中心点或指定点进行角度旋转的操作。可以实现任意角度的旋转。在 OpenCV 中,可以使用 cv::getRotationMatrix2Dcv::warpAffine 函数实现图像的旋转操作。

  5. 平移(Translation): 平移是沿着图像的水平和垂直方向移动图像的操作。可以将图像向左、向右、向上或向下平移。在 OpenCV 中,可以使用仿射变换矩阵来实现图像的平移操作。

  6. 仿射变换(Affine Transformation): 仿射变换是包括平移、旋转、缩放和剪切等操作的一种线性变换。可以通过变换矩阵来描述。在 OpenCV 中,可以使用 cv::getAffineTransform 函数和 cv::warpAffine 函数实现仿射变换。

  7. 透视变换(Perspective Transformation): 透视变换是用于处理图像的透视失真的变换操作。常用于校正摄像头捕捉的斜视图像。在 OpenCV 中,可以使用 cv::getPerspectiveTransform 函数和 cv::warpPerspective 函数实现透视变换。

        这些几何变换技术在图像处理和计算机视觉中具有广泛的应用,可以用于图像校正、对象检测、图像配准等任务。在实际应用中,常常需要结合多种几何变换来实现复杂的图像处理效果。

矩阵的转置(transpose

        图像的转置就是将图像像素的x坐标和y坐标互换。这样将改变图像的高度和宽度,转置后图像的高度和宽度也将互换。

        函数原型:

void cv::transpose(InputArray src, OutputArray dst)

        函数可描述为: 

                dst(i,j)=src(j,i)

镜像变换(flip)

        它可以沿水平、垂直或两个方向同时对图像进行翻转。

函数原型:

void cv::flip(InputArray src, OutputArray dst, int flipCode)
  • flipCode:指定翻转操作的方式。
    • 当 flipCode > 0 时,沿着 x 轴翻转(水平翻转)。
    • 当 flipCode = 0 时,沿着 y 轴翻转(垂直翻转)。
    • 当 flipCode < 0 时,同时沿着 x 轴和 y 轴翻转(水平和垂直同时翻转)。       

函数可描述为: 

可以配合transpose 实现简单的旋转,如下面代码实现90、180、270度的旋转:

    if (degree == 90) 
    {
        cv::transpose(src, desc);
        cv::flip(desc, desc, 1);
    } 
	else if (degree == 180) 
	{
        cv::flip(src, desc, -1);
    } 
	else if (degree == 270) 
	{
        cv::transpose(src, desc);
        cv::flip(desc, desc, 0);
    }

缩放(Resize)

        cv::resize 用于调整图像大小的函数,它可以将输入图像按指定的缩放因子或目标尺寸进行放大或缩小,生成一个新的尺寸不同的输出图像。该函数在图像处理、计算机视觉以及需要调整图像分辨率的各类应用中广泛使用。

函数原型

cv::resize(
    InputArray src,
    OutputArray dst,
    Size dsize,
    double fx = 0,
    double fy = 0,
    int interpolation = INTER_LINEAR
);
  • int interpolation (默认为 INTER_LINEAR): 插值方法,用于决定如何计算新像素位置的值。可选值包括:

    • INTER_NEAREST: 最近邻插值(快速,但可能会出现锯齿)。
    • INTER_LINEAR: 双线性插值(平滑,适用于大部分情况)。
    • INTER_AREA: 使用像素区域关系进行重采样(保持图像面积,适合缩小图像)。
    • INTER_CUBIC: 三次样条插值(较慢,但更平滑)。
    • INTER_LANCZOS4: 兰索斯插值(最慢,最高质量,尤其适用于大幅图像缩放)。

使用示例

cv::Mat inputImage; // 假设已经加载了输入图像

cv::Mat resizedImage;
cv::resize(inputImage, resizedImage, cv::Size(640, 480)); // 指定目标尺寸为 640x480

// 或者按比例缩放
cv::resize(inputImage, resizedImage, {}, 0.5, 0.5); // 缩小至原图一半大小

// 现在 resizedImage 存储了调整大小后的图像

旋转(Rotation)

        根据指定的旋转中心、旋转角度和可选的缩放因子通过getRotationMatrix2D 函数生成一个2x3的旋转变换矩阵,该矩阵可以与 cv::warpAffine() 函数结合使用,实现图像的旋转操作。

使用示例

cv::Mat inputImage; // 假设已经加载了输入图像
cv::Point2f center(inputImage.cols / 2.0f, inputImage.rows / 2.0f); // 设置旋转中心为图像中心

double angle = 45.0 * CV_PI / 180.0; // 转换为弧度,逆时针旋转45度
double scale = 1.0; // 不进行缩放

cv::Mat rotMat = cv::getRotationMatrix2D(center, angle, scale);

// 接下来可以使用 rotMat 与 cv::warpAffine() 函数配合,实现图像的实际旋转操作
cv::Mat rotatedImage;
cv::warpAffine(inputImage, rotatedImage, rotMat, inputImage.size());

平移(Translation)

        图像平移是一种常见的图像处理操作,它将图像中的所有像素沿着指定的方向移动一定的距离。在 OpenCV 中,可以通过仿射变换来实现图像的平移。

下面是一个简单的步骤来实现图像的平移:

  1. 定义平移矩阵:首先,需要定义一个平移矩阵,它是一个 2x3 的矩阵,用于指定平移的距离。对于二维图像,平移矩阵的形式如下:

 1, 0, dx

 0, 1, dy

     2.应用仿射变换:接下来,使用 cv::warpAffine 函数来应用定义的平移矩阵,实现图像的平移。

使用示例

#include <opencv2/opencv.hpp>

int main() {
    // 读取图像
    cv::Mat image = cv::imread("image.jpg");

    // 定义平移矩阵
    cv::Mat M = (cv::Mat_<double>(2,3) << 1, 0, 100, 0, 1, 50); // 在 x 方向上平移 100 像素,在 y 方向上平移 50 像素

    // 应用仿射变换
    cv::Mat translatedImage;
    cv::warpAffine(image, translatedImage, M, image.size());

    // 显示原始图像和平移后的图像
    cv::imshow("Original Image", image);
    cv::imshow("Translated Image", translatedImage);
    cv::waitKey(0);

    return 0;
}

仿射变换(Affine Transformation)

        仿射变换是一种特殊的平面几何变换,包括平移、旋转、缩放和剪切(shear),但不包括透视效应。该函数根据提供的三对对应点生成一个2x3的仿射变换矩阵,该矩阵可以与 cv::warpAffine() 函数结合使用,实现图像的仿射变换。

仿射变换步骤:

  1. 计算仿射变换矩阵: 根据给定的源图像中三个点 src 与目标图像中对应三个点 dst,计算出一个2x3的仿射变换矩阵。该矩阵描述了从源图像到目标图像的线性变换关系,可以应用于整个图像,使得图像中所有点都按照仿射变换规则进行映射。

  2. 返回结果: 返回计算得到的仿射变换矩阵,类型为 cv::Mat,大小为 2x3,元素类型通常为 CV_64F(双精度浮点数)。

使用示例

cv::Point2f srcPts[3] = { /* 三个源图像对应点坐标 */ };
cv::Point2f dstPts[3] = { /* 三个目标图像对应点坐标 */ };

cv::Mat affineTransform = cv::getAffineTransform(srcPts, dstPts);

// 接下来可以使用 affineTransform 与 cv::warpAffine() 函数配合,实现图像的实际仿射变换操作
cv::Mat transformedImage;
cv::warpAffine(inputImage, transformedImage, affineTransform, inputImage.size());

透视变换(Perspective Transformation)

        透视变换是一种复杂的二维几何变换,能够模拟真实世界中物体因距离差异而产生的远小近大的透视效果,常用于图像的校正、拼接、虚拟现实(VR)、增强现实(AR)等应用。

透视变换步骤:

  1. 计算透视变换矩阵: 根据给定的源四边形顶点 src 和目标四边形顶点 dst,使用最小二乘法计算出一个3x3的透视变换矩阵。该矩阵描述了从源四边形到目标四边形的线性变换关系,可以应用于整个图像,使得图像中所有点都按照透视变换规则进行映射。

  2. 返回结果: 返回计算得到的透视变换矩阵,类型为 cv::Mat,大小为 3x3,元素类型通常为 CV_64F(双精度浮点数)。

使用示例

cv::Point2f srcPts[4] = { /* 四个源图像顶点坐标 */ };
cv::Point2f dstPts[4] = { /* 四个目标图像顶点坐标 */ };

cv::Mat perspTransf = cv::getPerspectiveTransform(srcPts, dstPts);

// 接下来可以使用 perspTransf 与 cv::warpPerspective() 函数配合,实现图像的实际透视变换操作
cv::Mat transformedImage;
cv::warpPerspective(inputImage, transformedImage, perspTransf, inputImage.size());

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/580605.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Hot100-哈希法

1. 两数之和 - 力扣&#xff08;LeetCode&#xff09; 在做面试题目的时候遇到需要判断一个元素是否出现过的场景应该第一时间想到哈希法 class Solution {public int[] twoSum(int[] nums, int target) {int[] result new int[2];for (int i 0; i < nums.length;i){for…

性能监控数据(本地、服务器)

CPU、内存、磁盘等的监控 一、mac本地性能监控 1. top 终端&#xff1a; top load Avg: 平均负载(1分钟&#xff0c;5 分钟&#xff0c;15 分钟)值不能超过 4&#xff0c;要不然就是超负荷运行 Tasks: 进程数 %Cpu(s): idle :剩余百分比 KiB Mem: free:剩余内存&#xff0…

Rancher-Longhorn-新增磁盘以及卷创建原理和卷副本调度规则

一、添加磁盘-官网指引 重点在于&#xff1a; 1、比如你新增了一块盘&#xff0c;你需要做一下事情&#xff1a; 1、执行 lsblk 能找到你的盘。 2、然后执行 fdisk /dev/sdxx 分区你的盘。 3、然后对于分区部署文件系统&#xff0c; mkfs.xfs 4、然后执行 mount /dev/sdxxx 你…

【每日刷题】Day25

【每日刷题】Day25 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. 238. 除自身以外数组的乘积 - 力扣&#xff08;LeetCode&#xff09; 2. 82. 删除排序链表中的重复…

数据结构练习:链表扩容

大致步骤&#xff1a; 一&#xff1a;创建一个新链表&#xff0c;遍历原链表的同时&#xff0c;将原链表的值复制给新链表 二&#xff1a;将新链表插入到原链表中&#xff08;大致如下&#xff09; 注&#xff1a; 1.头结点是不存有数据的 2.记得malloc后要free 3.*&是…

uniapp真机调试无法调用之前页面的方法

在uniapp通过getCurrentPages&#xff08;&#xff09;页面栈调用之前页面方法&#xff0c;h5可生效但app真机调试找不到方法 let pages getCurrentPages()let beforePage pages[pages.length - 3]beforePage.refresh() //真机调试refresh为undefined解决&#xff1a; 后面…

5G前传光纤传输的25G光模块晶振SG2016CAN

一款适用于5G前传光纤传输网络中的25G光模块的5G晶振SG2016CAN。随着5G时代的到来&#xff0c;5G晶振的重要性也不言而喻&#xff0c;小体积宽温晶振SG2016CAN可以用于5G前传的25G光模块&#xff0c;具有高稳定性、小体积、宽温等优势。在5G前传光纤传输网络中&#xff0c;25G光…

操作系统课程--考纲要求

第一/二次课&#xff1a; 绪论 【学习内容与目标】 1、操作系统目标及定义 掌握操作系统的设置目标&#xff0c;理解并掌握操作系统的定义&#xff0c;了解操作系统的地位以及从资源管理者角度和用户角度了解操作系统的组成。 2、 操作系统的特征与功能 掌握操作系统的特征&…

吴恩达2022机器学习专项课程(一) 6.2 逻辑回归第三周课后实验:Lab2逻辑回归

问题预览/关键词 逻辑回归预测分类创建逻辑回归算法Sigmoid函数Sigmoid函数的表示sigmoid输出的结果Numpy计算指数的方法实验python实现sigmoid函数打印输入的z值和sigmoid计算的值可视化z值和sigmoid的值添加更多数据&#xff0c;使用逻辑回归可以正常预测分类![在这里插入图片…

【C++航海王:追寻罗杰的编程之路】C++11(四)

目录 1 -> 相关文章 【C航海王&#xff1a;追寻罗杰的编程之路】C11(一) 【C航海王&#xff1a;追寻罗杰的编程之路】C11(二) 【C航海王&#xff1a;追寻罗杰的编程之路】C11(三) 2 -> lambda表达式 2.1 -> C98中的一个例子 2.2 -> lambda表达式 2.3 ->…

【国产虚拟仪器】 NI-9205模块国产替代,±10 V,250 kS/s,16位,32通道C系列电压输入模块

10 V&#xff0c;250 kS/s&#xff0c;16位&#xff0c;32通道C系列电压输入模块 ​NI‑9205​可​执行​单​端​或​差分​模拟​输入&#xff0c;​每​个​具有​四​个​可​编​程​的​输入​范围。 该​模​块​以​较​低​的​价格​提供​了​高​通道​数​和​高…

Markdown编辑器的使用

欢迎使用Markdown编辑器 你好&#xff01; 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章&#xff0c;了解一下Markdown的基本语法知识。 新的改变 我们对Markdown编辑器进行了一些功能拓展与语法支持&#x…

Netperf网络测试

Netperf网络测试 Netperf简介安装NetperfCentos7安装NetperfWindows安装Netperf 批量网络流量性能测试启动netserver服务端 查看netperf帮助查看netper参数查看netserver参数 TCP_STREAM测试启动netserver服务端客户端 UDP_STREAM测试启动netserver服务端客户端 测试请求/应答网…

【Python】Python语言基础

1、运用python的输入输出函数 2、运行python的条件表达式 3、练习导入库函数并使用 1、运用输入输出函数编写程序&#xff0c;将华氏温度转换成摄氏温度。换算公式&#xff1a;C(F-32)*5/9,其中C为摄氏温度&#xff0c;F为华氏温度。 &#xff08;1&#xff09;源代码&#…

心理学上有个概念叫:习惯性反驳(附上解决办法)

在心理学上&#xff0c;有一个词&#xff0c;叫做习惯性反驳。 什么意思呢&#xff1f; 就是不管你说什么&#xff0c;他都要反驳你&#xff0c;最后把你带入负面的情绪黑洞&#xff0c;搞得你非常崩溃。 一个总是习惯性反驳的人&#xff0c;其实是非常可怕的。 习惯性反驳的3个…

.net EntityFramework EF

创建EF 方法1 方法二 安装的 版本是 中间没有弹出让选框架的界面&#xff0c; EF三种开发方式 1》》 db first 先设计数据库→然后在代码通过EF与数据库建立映射关系&#xff0c;是EF最早的一种使用方式,使用广泛.以数据库为驱动&#xff0c;生成实体模型&#xff0c;从而驱…

喀秋莎Camtasia2023中文破解Crack下载附安装教程 2023免费补丁百度云 电脑版注册机提取

Camtasia2023破解版是一款备受好评的电脑录屏软件&#xff0c;主要用于教授课程&#xff0c;培训他人&#xff0c;以及进行沟通和屏幕分享。内置视频编辑器支持拖放文本&#xff0c;提供了强大的屏幕录像、视频的剪辑和编辑、视频菜单制作、视频剧场和视频播放功能等&#xff0…

C#实现 IDbConnection / IDbCommand 等相关通用数据接口

目录 关于数据接口 对象执行流程 范例运行环境 设计与实现 引用 GetConnection方法 GetCommand方法 GetParameter方法 小结 关于数据接口 在.net 应用中&#xff0c;与数据库进行连接、访问和执行经常会用到数据接口的相关对象&#xff0c;如下&#xff1a; 1、 Con…

【深度学习实战(26)】标签处理之语义分割标签转换,数据集划分

一、标签转换 我们在使用labeme标签工具&#xff0c;标注完数据后会获得json文件。在标注结束过后&#xff0c;我们需要通过标签转换操作&#xff0c;生成jpg格式原始图片和png格式mask标签图。 1.1 使用img_b64_to_arr将json标签中二进制图像数据变成numpy格式数据&#xf…

场外个股期权是什么

场外个股期权是什么 场外个股期权是指在沪深交易所之外交易的个股期权&#xff0c;其本质是一种金融衍生品&#xff0c;允许投资者在股票交易场所外以特定价格买进或卖出证券。这种权利与股价变动情况紧密相关&#xff0c;使得投资者能够根据股价的变动情况对公司进行投票决定…
最新文章