OpenCV 图片缩放
时间:2022-07-22
本文章向大家介绍OpenCV 图片缩放,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
OpenCV图片缩放
resize方法
对图像进行缩放的最简单方法就是调用OpenCV中resize
函数。resize
函数可以将源图像精确地转化为指定尺寸的目标图像。要缩小图像,一般推荐使用CV_INETR_AREA来插值;若要放大图像,推荐使用CV_INTER_LINEAR。
void resize(
InputArray src,
OutputArray dst,
Size dsize,
double fx=0,
double fy=0,
int interpolation=INTER_LINEAR
);
-
src
输入图像. -
dst
输出图像; 其size
为dsize
,或由src.size()
、fx
与fy
计算而得;dst
类型与src
保持一致. -
dsize
输出图像的size
; -
fx
水平轴缩放因子; -
fy
竖直轴缩放因子; -
interpolation
选项见下表:
interpolation 选项 |
所用的插值方法 |
---|---|
INTER_NEAREST |
最近邻插值 |
INTER_LINEAR |
双线性插值(默认设置) |
INTER_AREA |
区域插值法 |
INTER_CUBIC |
双三次插值法 |
图像金字塔方法
图像金字塔同样也是进行图像缩放的,我们先来看一下什么是图像金字塔:
其实非常好理解,如上图所示,我们将一层层的图像比喻为金字塔,层级越高,则图像尺寸越小,分辨率越低。
两种类型的金字塔:
- 高斯金字塔:用于下采样,主要的图像金字塔;
- 拉普拉斯金字塔:用于重建图像,也就是预测残差,对图像进行最大程度的还原。比如一幅小图像重建为一幅大图像。
图像金字塔有两个高频出现的名词:上采样和下采样。现在说说他们俩。
- 上采样:就是图片放大,使用
PryUp
函数。将图像在每个方向放大为原来的两倍,新增的行和列用0填充,使用先前同样的内核(乘以4)与放大后的图像卷积,获得新增像素的近似值。 - 下采样:就是图片缩小,使用
PryDown
函数。对图像进行高斯内核卷积,然后将所有偶数行和列去除。
上、下采样都存在一个严重的问题,那就是图像变模糊了,因为缩放的过程中发生了信息丢失的问题。要解决这个问题,就得看拉普拉斯金字塔了。
参考代码
#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>
using namespace cv;
int main(int argc, char** argv) {
Mat src;
src = imread("cat.jpg");
if (!src.data) {
printf("could not load image...n");
return -1;
}
namedWindow("input image", CV_WINDOW_AUTOSIZE);
imshow("input image", src);
/* resize 方法 */
//方式一:转换为任意尺寸
Mat dst1;
dst1 = Mat::zeros(512, 512, CV_8UC3); //转化为512*512大小
resize(src, dst1, dst1.size());
namedWindow("resize1", CV_WINDOW_AUTOSIZE);
imshow("resize1", dst1);
imwrite("resize1.jpg",dst1);
//方式二:按比例缩放
Mat dst2;
resize(src, dst2, Size(),0.5,0.5);//我长宽都变为原来的0.5倍
namedWindow("resize2", CV_WINDOW_AUTOSIZE);
imshow("resize2", dst2);
imwrite("./resize2.jpg",dst2);
/* 图像金字塔 */
Mat dst3,dst4;
pyrUp(src, dst3, Size(src.cols*2, src.rows*2)); //放大一倍
pyrDown(src, dst4, Size(src.cols*0.5, src.rows*0.5)); //缩小为原来的一半
namedWindow("resize3", CV_WINDOW_AUTOSIZE);
namedWindow("resize4", CV_WINDOW_AUTOSIZE);
imshow("resize3", dst3);
imshow("resize4", dst4);
imwrite("./resize3.jpg",dst3);
imwrite("./resize4.jpg",dst4);
waitKey(0);
return 0;
}
结果
注意:通过上图resize2与resize4的结果比较,我们可以看出:采用图像金字塔缩放与图片
resize
方法的结果不太一致。图像金字塔缩放的结果明显要模糊!
参考
http://www.cnblogs.com/skyfsm/p/6876732.html
- 斐波那契查找原理详解与实现
- 增量数据丢失的原因分析(二)(r8笔记第76天)
- pycharm 之模块与模块引用
- 判断栈的出栈顺序合法性
- Combination Sum II 组合数求和之2-Leetcode
- Combination Sum 组合数求和-Leetcode
- python 中输出字符的颜色控制属性
- 一则数据库无法重启的案例分析(r8笔记第96天)
- 最大公约数和最小公倍数及其应用(Go语言解法)
- JAVA private私有类的 默认构造函数 的生成过程
- 一次数据变更的审核过程(r8笔记第95天)
- JavaScript 学习一
- 与Ajax同样重要的jQuery(2)
- 寻找第K元素的八大算法、源码及拓展
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Spring Boot 运行源码剖析
- Spring Boot 特性之 Lazy
- Spring Boot 特性之 Banner
- Spring Boot 特性之 Fluent Builder API
- 一文搞懂 Flink Timer
- DATE类型的“小陷阱”
- 简单聊下 Java Agent
- Byte Buddy 基础知识
- 两种在SAP Cloud Application Studio里通过编程对C4C UI字段赋值的方法
- 如何使用 BTrace v.2.0.1
- 三分钟写一个 Java 多线程
- 使用纯粹的ABAP位操作实现两个整数相加
- 如何给SAP Cloud for Customer UI上的字段添加自定义校验逻辑
- guide-rpc-framework 源码学习
- 如何参与一个开源项目(多图)