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.mzph.cn/web/4440.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微服务之SpringCloud AlibabaNacos服务注册和配置中心

一、概述 1.1注册中心原理 在微服务远程调用的过程中&#xff0c;包括两个角色&#xff1a; 服务提供者&#xff1a;提供接口供其它微服务访问&#xff0c;比如item-service 服务消费者&#xff1a;调用其它微服务提供的接口&#xff0c;比如cart-service 在大型微服务项目…

符合医药行业规范的液氮罐运输和存储温度监测解决方案

API原料药、冻干物质和人体样本必须在玻璃相中以尽可能低的温度运输和存储。专门的低温容器——干式液氮罐——可通过液氮&#xff08;LN2&#xff09;将温度保持在-196 C。由于温度极低&#xff0c;低温容器的温度数据监测不仅具有挑战性&#xff0c;而且还需要更复杂的过程&a…

Linux下的常用基本指令

基本指令 前言ls 指令语法功能常用选项举例注意要点关于拼接关于 -a关于文件ls与/的联用ls与根目录ls与任意文件夹ls与常用选项与路径 ls -d与ls -ldls与ll pwd命令语法功能常用选项注意要点window与Linux文件路径的区别家目录 cd 指令语法功能举例注意要点cd路径.. .相对路径与…

Cesium116版本安装跑错,注意Node版本

SyntaxError: Unexpected token ?? at Loader.moduleStrategy (internal/modules/esm/translators.js:149:18) 无法解析ES node.js本本过低 nvm use无效NVM踩坑不完全指南&#xff0c;nvm use没有*_nvm use 无效-CSDN博客

决策树模型示例

通过5个条件判定一件事情是否会发生&#xff0c;5个条件对这件事情是否发生的影响力不同&#xff0c;计算每个条件对这件事情发生的影响力多大&#xff0c;写一个决策树模型pytorch程序,最后打印5个条件分别的影响力。 一 决策树模型是一种非参数监督学习方法&#xff0c;主要…

centos7 openresty lua 自适应webp和缩放图片

目录 背景效果图准备安装cwebp等命令&#xff0c;转换文件格式安装ImageMagick&#xff0c;压缩文件下载Lua API 操控ImageMagick的依赖包 代码参考 背景 缩小图片体积&#xff0c;提升加载速度&#xff0c;节省流量。 效果图 参数格式 &#xff1a; ?image_processformat,…

Llama-7b-Chinese本地推理

Llama-7b-Chinese 本地推理 基础环境信息&#xff08;wsl2安装Ubuntu22.04 miniconda&#xff09; 使用miniconda搭建环境 (base) :~$ conda create --name Llama-7b-Chinese python3.10 Channels:- defaults Platform: linux-64 Collecting package metadata (repodata.js…

Linux下软硬链接和动静态库制作详解

目录 前言 软硬链接 概念 软链接的创建 硬链接的创建 软硬链接的本质区别 理解软链接 理解硬链接 小结 动静态库 概念 动静态库的制作 静态库的制作 动态库的制作 前言 本文涉及到inode和地址空间等相关概念&#xff0c;不知道的小伙伴可以先阅读以下两篇文章…

智慧校园建设指导

智慧校园是一个庞大的业务系统&#xff0c;他涉及到校园事务的各个方面&#xff0c;包括教务&#xff0c;考务&#xff0c;教工&#xff0c;学工&#xff0c;办公&#xff0c;科研等。因此&#xff0c;建设符合学校业务需求的智慧校园平台&#xff0c;不仅需要做到认真负责外&a…

C语言位运算详解(移位操作符、位操作符)

目录 一、整数在内存中的存储方式 二、移位操作符 1、左移操作符 2、右移操作符 a.逻辑右移 b.算数右移 ps、移位操作符使用警告 三、位操作符 用例代码&#xff1a; a.按位与&#xff08;&&#xff09; b.按位或&#xff08;|&#xff09; c.按位异或&#xf…

【笔试强训】Day4 --- Fibonacci数列 + 单词搜索 + 杨辉三角

文章目录 1. Fibonacci数列2. 单词搜索3. 杨辉三角 1. Fibonacci数列 【链接】&#xff1a;Fibonacci数列 解题思路&#xff1a;简单模拟题&#xff0c;要最少的步数就是找离N最近的Fibonacci数&#xff0c;即可能情况只有比他小的最大的那个Fibonacci数以及比他大的最小的那…

《软件设计师教程:计算机网络浅了解计算机之间相互运运作的模式》

​ 个人主页&#xff1a;李仙桎 &#x1f525; 个人专栏: 《软件设计师》 ⛺️生活的理想&#xff0c;就是为了理想的生活! ​ ⛺️前言&#xff1a;各位铁汁们好啊&#xff01;&#xff01;&#xff01;&#xff0c;今天开始继续学习中级软件设计师考试相关的内容&#xff0…

Java高阶私房菜:JVM垃圾回收机制及算法原理探究

目录 垃圾回收机制 什么是垃圾回收机制 JVM的自动垃圾回收机制 垃圾回收机制的关键知识点 初步了解判断方法-引用计数法 GCRoot和可达性分析算法 什么是可达性分析算法 什么是GC Root 对象回收的关键知识点 标记对象可回收就一定会被回收吗&#xff1f; 可达性分析算…

【免费源码下载】完美运营版商城 虚拟商品全功能商城 全能商城小程序 智慧商城系统 全品类百货商城php+uniapp

简介 完美运营版商城/拼团/团购/秒杀/积分/砍价/实物商品/虚拟商品等全功能商城 干干净净 没有一丝多余收据 还没过手其他站 还没乱七八走的广告和后门 后台可以自由拖曳修改前端UI页面 还支持虚拟商品自动发货等功能 挺不错的一套源码 前端UNIAPP 后端PHP 一键部署版本&am…

52832 不使用micro_lib ,同时使用AC6编译器且使用printf问题

1. 因为我的工程用AC6是因为要跑自己的C 和 TensorFlow lite micro. 所以是C&#xff0c;C混合的工程&#xff0c;但是一直没法打印&#xff0c;所以写一个总结。 基本说明&#xff1a; micro_lib这种情况不要选&#xff0c;因为存在C文件 第一个坑&#xff1a; 第二个坑&…

windows 避免电脑强制息屏

许多打工人的电脑被公司设置了隔一段时间没有操作&#xff0c;就会自动息屏&#xff0c;如何避免这种事发生呢 方案一 自动操作鼠标的软件 如果能自由安装软件&#xff0c;可以下载自动移动鼠标的软件&#xff0c;设置鼠标每隔多长时间做一次什么操作&#xff0c;防止锁屏 方…

LIUNX:系统编程动态库加载(1)

目录 操作系统角度理解 如何加载 怎么管理库 编址 操作系统角度理解 如何加载 首先main想要运行&#xff0c;首先要为main创建task_struct和mm_struct&#xff0c;然后将main的代码和数据加载到内存&#xff0c;将main的代码通过页表映射到mm_struct的正文代码段&#xff0…

leetcode-比较版本号-88

题目要求 思路 1.因为字符串比较大小不方便&#xff0c;并且因为需要去掉前导的0&#xff0c;这个0我们并不知道有几个&#xff0c;将字符串转换为数字刚好能避免。 2.当判断到符号位的时候加加&#xff0c;跳过符号位。 3.判断数字大小&#xff0c;来决定版本号大小 4.核心代…

Unity | 优化专项-包体 | 字体

1. 字体包体占用 常用汉字字体文件大小通常在 10M~12M 左右&#xff0c;大概包含常见汉字 3.5w 个。我国汉字有大约将近十万个&#xff0c;全字库的大小对于游戏包体是灾难性的 在小游戏中&#xff0c;即使是常见汉字&#xff0c;大小也足以影响小游戏总包体&#xff0c;进而…

qmt教程2----订阅单股行情,提供源代码

链接 qmt教程2----订阅单股行情&#xff0c;提供源代码 (qq.com) qmt教程1---qmt安装&#xff0c;提供下载链接 今天我重新封装了全部qmt的内容&#xff0c;包括数据&#xff0c;交易 qmt交易 我本来打算全部上次git的&#xff0c;但是考虑到毕竟是实盘的内容&#xff0c;就放…