计算机视觉全系列实战教程:(十)图像的几何变换:平移 旋转 翻转 缩放 仿射等变换

1.概述

(1)Why(为什么要进行图像的几何变换)

  • 校正图像形变:纠正由于拍摄角度或硬件原因导致的图像几何变形
  • 图像增强:在深度学习的模型训练时,通过几何变换获得更多的训练集
  • 图像配准和拼接:先进行几何变换矫正,然后实现图像的配准或拼接

(2)What(什么是图像的几何变换)

本质:对图像像素的位置进行改变的操作

(3)Which(有哪些几何变换)

  • 位置变换:平移、旋转(填充旋转和截断旋转)、镜像等变换
  • 形状变换:缩放、错切、透视等变换

说明:实现几何变换的关键在于将非齐次坐标转为齐次坐标,本质是将22的变换矩阵(二阶矩阵)拓展成33的变换矩阵(三阶矩阵)

2.位置变换

(1)平移变换

A.图像大小不变
可直接使用

/* 图像平移(截断)*/
int ImgTranslateTrunc(const cv::Mat& imSrc, cv::Mat& imDst, int ix, int  iy)
{cv::Mat M(2, 3, CV_32FC1);M.at<float>(0, 0) = 1;M.at<float>(0, 1) = 0;M.at<float>(0, 2) = ix;M.at<float>(1, 0) = 0;M.at<float>(1, 1) = 1;M.at<float>(1, 2) = iy;cv::warpAffine(imSrc, imDst, M, imSrc.size());return 1;
}

B.图像大小改变
可直接拷贝使用


/* 图像平移(填充)*/
int ImgTranslateFilled(const cv::Mat& imSrc, cv::Mat& imDst, int ix, int iy)
{cv::Mat M(2, 3, CV_32FC1);M.at<float>(0, 0) = 1;M.at<float>(0, 1) = 0;M.at<float>(0, 2) = ix;M.at<float>(1, 0) = 0;M.at<float>(1, 1) = 1;M.at<float>(1, 2) = iy;cv::warpAffine(imSrc, imDst, M, imSrc.size() + cv::Size(ix, iy));return 1;
}

(2)图像旋转

一般认为图像的旋转指的是绕着图像的中心进行旋转;
关键:旋转中心+旋转角度
A.填充旋转


/* 图像旋转(填充)*/
int ImgRtFilled(const cv::Mat& imSrc, cv::Mat& imDst, double dAngle)
{// 图像的旋转中心int iWid = imSrc.cols, iHgt = imSrc.rows;cv::Point center = cv::Point(iWid / 2, iHgt / 2);// 获取M矩阵cv::Mat M = cv::getRotationMatrix2D(center, dAngle, 1.0);// 新的宽高 int iHgt_new = 0, iWid_new = 0;double alpha = dAngle * CV_PI / 180;iHgt_new = int(iWid * abs(sin(alpha)) + iHgt * abs(cos(alpha)));iWid_new = int(iHgt * abs(sin(alpha)) + iWid * abs(cos(alpha)));// 平移M.at<double>(0, 2) += (iWid_new - iWid) / 2;M.at<double>(1, 2) += (iHgt_new - iHgt) / 2;cv::warpAffine(imSrc, imDst, M, cv::Size(iWid_new, iHgt_new));return 1;
}

B.截断旋转

/* 图像旋转(截断)*/
int imgRtTrunc(const cv::Mat& imSrc, cv::Mat& imDst, double dAngle)
{cv::Point PCenter = cv::Point(imSrc.cols / 2, imSrc.rows / 2);cv::Mat M = getRotationMatrix2D(PCenter, dAngle, 1.0);cv::warpAffine(imSrc, imDst, M, imSrc.size());return 1;
}

(3)镜像变换

void cv::flip(cv::Mat &imSrc, cv::Mat &imDst, int Type  // 0表示x轴镜像,1表示y轴镜像,-1表示x和y轴的镜像);

3.图像缩放

(1)原理

将指定图像在x轴方向按照比例缩放fx倍,在y轴方向按照比例缩放fy倍
全比例缩放:如果在x轴方向和y轴方向的缩放比例相同,那么则称为全比例缩放

(2)How(如何进行图像的缩放)

void cv::resize(cv::Mat &imSrc,cv::Mat &imDst,cv::Size dsize, //目标图像的尺寸cv::double fx = 0, //x方向上的缩放比例cv::double fy = 0, //y方向上的缩放比例int interpolation = INTER_LINEAR, //插值方式);

参数interpolation的介绍:

  • INTER_NEAREST:最近邻插值
  • INTER_LINEAR:双线性插值
  • INTER_AREA:像素关系重采样,当图像缩小时,可避免出现波纹
  • INTER_ CUBIC:立方插值

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

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

相关文章

open-amv开发环境搭建

open-amv是基于rv1103主控芯片的视觉开发板子 1.板子使用 板子使用type c作为调试口&#xff0c;同时供电&#xff0c;请在电脑上下载adb&#xff0c;当板子通过tpye c与电脑连接后&#xff0c;执行命令adb shell就会进入到板子的linux系统命令行。 2.编译环境 2.1 搭建doc…

ipad协议已更新

mmtls 24算法&#xff0c;by golang 其他/v1/other POST/v1/other/GetPeopleNearby 查看附近的人 POST/v1/other/GetQrCode 获取二维码 同步消息/v1/ws GET/v1/ws/GetSyncMsg 同步消息&#xff0c;ws协议 消息/v1/message POST/v1/message/AddMessageMgr 添加要发送…

什么是无杂散动态范围 (SFDR)?为什么 SFDR 很重要?

有多种不同的规格可用于表征电路线性度。SFDR 指标是一种常用的规范。该指标定义为所需信号幅度与感兴趣带宽内杂散的比率&#xff08;图 1&#xff09;。 图 1. 显示 SFDR 指标的图表。 对于 ADC&#xff0c;SFDR 展示了 ADC 如何在存在大信号的情况下同时处理小信号。作为一个…

如何阅读?从阅读中学阅读—《海绵阅读法》

大家好&#xff0c;我是老三&#xff0c;最近读了《海绵阅读法&#xff1a;如何吸收一本书的精华》&#xff0c;第一次阅读教如何阅读的书&#xff0c;整理一番读书笔记&#xff0c;分享给大家。 读书动机 我前一阵子写了篇文章&#xff0c;2024Q1&#xff0c;盘点我看过的54本…

[Java基本语法] 逻辑控制与方法

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏:&#x1f355; Collection与数据结构 (92平均质量分)https://blog.csdn.net/2301_80050796/category_12621348.html?spm1001.2014.3001.5482 &#x1f9c0;线程与…

使用多进程和 Scrapy 实现高效的 Amazon 爬虫系统

在这篇博客中&#xff0c;将展示如何使用多进程和 Scrapy 来构建一个高效的 Amazon 爬虫系统。通过多进程处理&#xff0c;提高爬虫的效率和稳定性&#xff0c;同时利用 Redis 进行请求调度和去重。 项目结构 Scrapy 爬虫&#xff1a;负责从 Amazon 抓取数据。MongoDB&#x…

Unity中获取数据的方法

Input和GetComponent 一、Input 1、Input类&#xff1a; 用于处理用户输入&#xff08;如键盘、鼠标、触摸等&#xff09;的静态类 2、作用&#xff1a; 允许你检查用户的输入状态。如某个键是否被按下&#xff0c;鼠标的位置&#xff0c;触摸的坐标等 3、实例 (1) 键盘…

一键解锁创意无界:高效AI生成古典肖像图片,轻松打造艺术化身

在数字化时代&#xff0c;创意与艺术的结合正逐渐改变我们的生活。你是否曾梦想过拥有一幅专属于自己的古典肖像画&#xff0c;却又苦于找不到合适的画师或高昂的费用而望而却步&#xff1f;现在&#xff0c;这一切都将成为现实&#xff01; 进入首助编辑高手的AI魔法智绘图板块…

你能不能手敲出Spring框架?

Spring最成功的地方在于创始人Rod Johnson提出的IOC、AOP核心理念&#xff0c;反而不是其本身的技术。技术上今天可以有Spring春天&#xff0c;明天就可以有Autumn秋天。 核心理念有多重要&#xff1f;就如1871年巴黎公社的失败。公社在对抗法国zf和普鲁士占领军的背景下成立&…

抉择与未来:计算机专业的选择与发展展望

2024年&#xff0c;计算机相关专业还值得选择吗&#xff1f; 随着2024年高考落幕&#xff0c;数百万高三学生又将面临人生中的重要抉择&#xff1a;选择大学专业。在这个关键节点&#xff0c;计算机相关专业是否仍是“万金油”的选择&#xff1f;在过去很长一段时间里&#xff…

英伟达开源 3400 亿巨兽:98% 合成数据训出最强开源通用模型,性能对标 GPT-4o

NVIDIA 最近开源了其大型语言模型 Nemotron-4 340B&#xff0c;这是一个具有划时代意义的模型&#xff0c;它使用了高达 98% 的合成数据进行训练&#xff0c;并且在性能上与 GPT-4 相当。Nemotron-4 340B 包括基础模型、指令模型和奖励模型&#xff0c;支持 4K 上下文窗口、50 …

回答网友的一个Delphi问题

网友想在grid 中 加一个水印&#xff0c;俺就给他写了个例子。先靠效果&#xff1a; 这个例子 包含下面几步&#xff1a; 1、创建背景 dg_bmp:Tbitmap.Create; w: Image1.Picture.Bitmap.width; h: Image1.Picture.Bitmap.height; dg_bmp.width: w*2; dg_bmp.height: …

从入门到高手的99个python案例(2)

51. 列表和数组比较 - 列表通用&#xff0c;NumPy数组高效。 import numpy as np normal_list [1, 2, 3] np_array np.array([1, 2, 3]) print(np_array.shape) # 输出 (3,), 数组有形状信息 52. Python的内置模块datetime - 处理日期和时间。 from datetime import…

数据库MySQL——从0到1入门教程

Q:为什么需要MySQL&#xff1f; A:网络服务中&#xff0c;我们需要存储、管理大量的数据&#xff0c;并确保数据的安全、实现增删改查操作的高效&#xff0c;因此需要一个系统用来专门管理数据&#xff0c;以实现上述的高性能要求&#xff0c;数据库管理系统应需而生 八股如下…

Notepad++ 使用正则表达式删除空行空格方法

删除所有空格 查找框输入&#xff1a;^\s&#xff0c;替换框留空&#xff0c;什么也不输入&#xff0c;一键全部替换即可。 删除所有空行 查找框输入&#xff1a;\r\n\r\n&#xff0c;替换框输入&#xff1a;\r\n&#xff0c;一键全部替换即可。 段落之间空一行 思路&#…

MySQL(7)

创建和管理表 1. 创建和管理数据库 1.1 如何创建数据库 #方式1&#xff1a;CREATE DATABASE mytest1; # 创建的此数据库使用的是默认的字符集#查看创建数据库的结构SHOW CREATE DATABASE mytest1;#方式2&#xff1a;显式了指名了要创建的数据库的字符集CREATE DATABASE myt…

nginx配置后访问出现白屏怎么办?

问题 服务器上有两个web服务ab分别指向3000、3001两个端口&#xff0c;使用nginx进行反向代理&#xff0c;配置文件如下&#xff1a; server {listen 80;server_name www.example.com;location /a/ {proxy_pass http://localhost:3000;proxy_set_header Host $host;proxy_set…

自动化数据驱动?最全接口自动化测试yaml数据驱动实战

前言 我们在做自动化测试的时候&#xff0c;通常会把配置信息和测试数据存储到特定的文件中&#xff0c;以实现数据和脚本的分离&#xff0c;从而提高代码的易读性和可维护性&#xff0c;便于后期优化。 而配置文件的形式更是多种多样&#xff0c;比如&#xff1a;ini、yaml、…

pytorch 笔记:torch.dist

torch.dist 函数是 PyTorch 库中用来计算两个张量之间的距离的函数。该函数主要用来计算指定阶数的距离&#xff0c;比如欧几里得距离&#xff08;默认情况下&#xff09; torch.dist(input, other, p2)input第一个输入张量other第二个输入张量&#xff0c;需要与第一个张量的…

数据结构--力扣144.二叉树的前序遍历(C

链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09;【点击即可跳转】 使用c语言来实现。 代码展示为&#xff1a; /*** Note: The returned array must be malloced, assume caller calls free().*/int TreeSize( struct TreeNode* root) {return rootNULL?0:TreeS…