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

本文主要是介绍计算机视觉全系列实战教程:(十)图像的几何变换:平移 旋转 翻转 缩放 仿射等变换,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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.chinasem.cn/article/1063970

相关文章

计算绕原点旋转某角度后的点的坐标

问题: A点(x, y)按顺时针旋转 theta 角度后点的坐标为A1点(x1,y1)  ,求x1 y1坐标用(x,y)和 theta 来表示 方法一: 设 OA 向量和x轴的角度为 alpha , 那么顺时针转过 theta后 ,OA1 向量和x轴的角度为 (alpha - theta) 。 使用圆的参数方程来表示点坐标。A的坐标可以表示为: \[\left\{ {\begin{ar

《计算机英语》Unit 1 Computer Overview 计算机概述

期末试卷组成 1、选择20道 2、判断20道 3、词汇翻译(单词+词组,参照课后习题) 4、翻译2道(一道原题,参照作业) SectionA About Computer 关于计算机 algorithm          n.  算法  operate          v.  操作  digital           adj. 数字的  integrated circuit

React+TS前台项目实战(十七)-- 全局常用组件Dropdown封装

文章目录 前言Dropdown组件1. 功能分析2. 代码+详细注释3. 使用方式4. 效果展示 总结 前言 今天这篇主要讲全局Dropdown组件封装,可根据UI设计师要求自定义修改。 Dropdown组件 1. 功能分析 (1)通过position属性,可以控制下拉选项的位置 (2)通过传入width属性, 可以自定义下拉选项的宽度 (3)通过传入classN

KLayout ------ 旋转物体90度并做平移

KLayout ------ 旋转创建的物体 正文 正文 前段时间,有个小伙伴留言问我,KLayout 中如何旋转自己创建的物体,这里特来说明一下。 import pyapoly = pya.DPolygon([pya.DPoint(0, 0), pya.DPoint(0, 5), pya

Steam邮件推送内容有哪些?配置教程详解!

Steam邮件推送功能是否安全?如何个性化邮件推送内容? Steam作为全球最大的数字游戏分发平台之一,不仅提供了海量的游戏资源,还通过邮件推送为用户提供最新的游戏信息、促销活动和个性化推荐。AokSend将详细介绍Steam邮件推送的主要内容。 Steam邮件推送:促销优惠 每当平台举办大型促销活动,如夏季促销、冬季促销、黑色星期五等,用户都会收到邮件通知。这些邮件详细列出了打折游戏、

X-AnyLabeling使用教程

1.AI 模型自动分割标注使用教程 2.AI 模型自动目标检测标注使用教程

剑指offer(C++)--翻转单词顺序列

题目 牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么? class S

剑指offer(C++)--左旋转字符串

题目 汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它! class Solution {public:string LeftRotateStri

青龙面板2.9之Cdle傻妞机器人编译教程

看到有的朋友对傻妞机器人感兴趣,这里写一下傻妞机器人的编译教程。 第一步,这里以linux amd64为例,去官网下载安装go语言安装包: 第二步,输入下方指令 cd /usr/local && wget https://golang.google.cn/dl/go1.16.7.linux-amd64.tar.gz -O go1.16.7.linux-amd64.tar.gz

青龙面板部署通用教程,含服务器、路由器、X86等部署方法

1. 拉取镜像/更新镜像 docker pull whyour/qinglong:latest 2. 删除镜像 docker rmi whyour/qinglong:latest 3. 启动容器 普通服务器 docker run -dit \-v $PWD/ql/config:/ql/config \-v $PWD/ql/log:/ql/log \-v $PWD/ql/db: