【学习OpenCV4】图像变换方法总结(放缩、翻转、旋转)
图像变换方法
- 一、图像放缩Resize
- 二、图像翻转flip
- 三、图像旋转warpAffine
一、图像放缩Resize
1.1 基本知识
图像放缩用到了许多插值方法,常见的差值算法有线性插值、立方差值、双立方差值、采样放缩算法等等。
所使用的API为 resize()
,函数的定义如下
void resize(
InputArray src, //输入图像
OutputArray dst,//输出图像
Size dsize, //输出尺寸
double fx=0, //水平缩放比例
double fy=0, //垂直缩放比例
int interpolation=INTER_LINEAR //插值方式
)
- 其中dsize为0时,fx和fy均不可为零;fx和fy为0时,输出图像按dsize输出
- interpolation内插方式有以下四种:
- CV_INTER_NEAREST 最邻近插值点法
- CV_INTER_LINEAR 双线性插值法
- CV_INTER_AREA 邻域像素再取样插补
- CV_INTER_CUBIC 双立方插补,4*4大小的补点
1.2 示例程序
void MyDemo::resize_Demo(Mat& image) {Mat zoomin, zoomout; //定义输出图像int h = image.rows; //获取原图像的宽高int w = image.cols;resize(image, zoomin, Size(w * 1.5, h * 1.5), 0, 0, INTER_LINEAR); //图像放大1.5倍imshow("zoomin", zoomin);resize(image, zoomout, Size(w / 2, h / 2), 0, 0, INTER_LINEAR); //图像缩小2倍imshow("zoomout", zoomout);
}
二、图像翻转flip
图像反转就是将图像左右或上下反转镜像。所用到的函数是 flip()
,函数的定义如下。
void cv::flip(cv::InputArray src, // 输入图像cv::OutputArray dst, // 输出图像int flipCode = 0 // >0: 沿y轴翻转, 0: 沿x轴翻转, <0: x、y轴同时翻转);
测试程序如下:
void MyDemo::flip_Demo(Mat& image) {Mat dst;flip(image, dst, 0); //上下翻转imshow("上下翻转", dst);flip(image, dst, 1); //左右翻转imshow("左右翻转", dst);flip(image, dst, -1); //对角线翻转(180°旋转)imshow("对角线翻转(180°旋转)", dst);
}
三、图像旋转warpAffine
void cv::warpAffine (InputArray src, //输入图像OutputArray dst, //输出图像InputArray M, //变换矩阵Size dsize, //输出图像大小int flags = INTER_LINEAR, //插值方式int borderMode = BORDER_CONSTANT, //图像边缘像素模式const Scalar& borderValue = Scalar() //边界填充值
其中M变换矩阵可以通过如下函数获得,旋转矩阵的形式如下:
M=cv2.getRotationMatrix2D(center, angle, scale)
由于旋转之后,图像的大小会发生变化,因此需要重新计算图像的长宽,计算方法可以参考下图:
图像旋转的示例程序如下:
void MyDemo::rotate_Demo(Mat& image) {Mat dst, M;int h = image.rows;int w = image.cols;M = getRotationMatrix2D(Point2f(w / 2, h / 2), 45, 1.0); //定义变换矩阵Mdouble cos = abs(M.at<double>(0, 0)); //求cos值double sin = abs(M.at<double>(0, 1)); //求sin值int nw = cos * w + sin * h; //计算新的长、宽int nh = sin * w + cos * h;M.at<double>(0, 2) += (nw / 2 - w / 2); //计算新的中心M.at<double>(1, 2) += (nh / 2 - h / 2);warpAffine(image, dst, M, Size(nw,nh), INTER_LINEAR,0,Scalar(255,255,255));imshow("Rotation", dst);
}
【学习OpenCV4】图像变换方法总结(放缩、翻转、旋转)相关推荐
- 翻转和旋转计算机教学,小学信息技术《翻转/旋转》教学设计及教学反思
<汤姆和杰瑞>教学设计 教学目标: 1.能够使用学过的绘图工具,结合翻转与旋转,绘制精美的图画. 2.练习中要从不同的角度对图形进行翻转和旋转,通过反复练习,掌握图形变形的操作技巧 3.在 ...
- 比较全的深度学习数据预处理方法
当前深度学习的预处理方法 1.中心化/零均值化 程序代码 2.标准化/归一化 程序代码 (1)标准化与归一化的联系和差异 联系 差异 (2)为什么要归一化/标准化 ①某些模型求解需要 ②一些分类器需要 ...
- 面向弹载图像的深度学习网络压缩方法研究
这里写自定义目录标题 源自:航空兵器 作者:高一博 杨传栋 陈栋 凌冲 摘 要 针对基于深度学习目标识别算法具有网络结构复杂.参数量大.计算延迟高等特点,难以直接应用于弹载任务的问题,对网络轻量化方法 ...
- 【学习OpenCV4】案例1:Windows OpenCV C++语言开发环境搭建
本文的案例内容源自于图书**<学习OpenCV 4:基于Python的算法实战>**,该书是国内第一本完整介绍OpenCV4的图书,第一章有在各个平台搭建环境的介绍,后面每个章节都有对模块 ...
- Android学习笔记-recreate()方法导致fragment重复新建的问题,解决方法
Android学习笔记-recreate()方法导致fragment重复新建的问题,解决方法 今天修改一个比较奇怪的bug: 在操作一个事件的时候,使用eventbus来监听事件,断点发现有时候是会执 ...
- 【学习OpenCV4】键盘鼠标操作总结
本文分享内容来自图书<学习OpenCV 4:基于Python的算法实战>,该书内容如下: 第1章 OpenCV快速入门: 第2章 图像读写模块imgcodecs: 第3章 核心库模块cor ...
- 【学习OpenCV4】漫水填充算法使用总结
本文分享内容来自图书<学习OpenCV 4:基于Python的算法实战>,该书内容如下: 第1章 OpenCV快速入门: 第2章 图像读写模块imgcodecs: 第3章 核心库模块cor ...
- 计算机视觉-深度学习图像检测方法梳理
计算机视觉-深度学习图像检测方法梳理 由于之后要转方向啦,趁这段时间整理手中硕士研究方向的一些阅读笔记,这是一篇关于计算机视觉的基础知识梳理 先搞清一些小知识点 首先我们要弄清楚图像分类.目标定位.语 ...
- 【学习OpenCV4】OpenCV边缘检测算法总结
本文分享内容来自图书<学习OpenCV 4:基于Python的算法实战>,该书内容如下: 第1章 OpenCV快速入门: 第2章 图像读写模块imgcodecs: 第3章 核心库模块cor ...
最新文章
- js innerHTML 改变div内容的方法
- linux 追加多行文件,linux多行文件信息追加
- android resolvesize方法,Android 自定义View中onMeasure()中使用resolveSize()是什么意思?
- 了解快照隔离和行版本控制
- 《天天数学》连载34:二月三日
- go java websocket_java的连接wss的websocket服务器代码如何转成go代码
- Latex beamer 学习总结
- Java多线程 ReentrantLock、Condition 实现生产者、消费者协作模式
- IAP测试购买失败,Error Domain=SKErrorDomain Code=0 无法连接到 iTunes Store
- 微信小程序手动获取自己位置wx.chooseLocation
- 扫描指定ip的指定端口,识别开放的端口所对应的服务
- 【微信小程序】性能分析Trace工具
- java 解析dex_将DEX反编译成Java源代码
- httpclient4下载图片 java实现
- c语言怎样处理lrc文件格式,lrc文件的一般格式是什么_教你如何打开lrc文件 - 驱动管家...
- 发布infopath模板到sharepoint站点(Infopath 2007)
- 基于OMNET++仿真平台的4维超立方体网络仿真
- 深度学习笔记~感受野(receptive field)的计算
- mycat 分表分库
- 闰秒(leapsecond)和原子钟(Atomic Clock)究竟是什么