对图像进行缩放的最简单方法当然是调用resize函数啦!

resize函数可以将源图像精确地转化为指定尺寸的目标图像。

要缩小图像,一般推荐使用CV_INETR_AREA来插值;若要放大图像,推荐使用CV_INTER_LINEAR。

现在说说调用方式

第一种,规定好你要图片的尺寸,就是你填入你要的图片的长和高。

  1. #include<opencv2\opencv.hpp>
  2. #include<opencv2\highgui\highgui.hpp>
  3. using namespace std;
  4. using namespace cv;
  5. //图片的缩小与放大
  6. int main()
  7. {
  8. Mat img = imread("lol5.jpg");
  9. imshow("原始图", img);
  10. Mat dst = Mat::zeros(512, 512, CV_8UC3); //我要转化为512*512大小的
  11. resize(img, dst, dst.size());
  12. imshow("尺寸调整之后", dst);
  13. waitKey(0);
  14. }

第二种,填入你要缩小或者放大的比率。

  1. #include<opencv2\opencv.hpp>
  2. #include<opencv2\highgui\highgui.hpp>
  3. using namespace std;
  4. using namespace cv;
  5. //图片的缩小与放大
  6. int main()
  7. {
  8. Mat img = imread("lol5.jpg");
  9. imshow("原始图", img);
  10. Mat dst;
  11. resize(img, dst, Size(),0.5,0.5);//我长宽都变为原来的0.5倍
  12. imshow("尺寸调整之后", dst);
  13. waitKey(0);
  14. }

接下来说说图像金字塔

说白了,图像金字塔就是用来进行图像缩放的,干的事情跟resize函数没两样,那我们还需要学它吗?我觉得有必要的额,因为在学习卷积神经网络中会遇到这个名词,所以都学一学吧,搞图形都绕不过他!

说说什么是图像金字塔。

其实非常好理解,如上图所示,我们将一层层的图像比喻为金字塔,层级越高,则图像尺寸越小,分辨率越低。

两种类型的金字塔:

  • 高斯金字塔:用于下采样,主要的图像金字塔;
  • 拉普拉斯金字塔:用于重建图像,也就是预测残差(我的理解是,因为小图像放大,必须插入一些像素值,那这些像素值是什么才合适呢,那就得进行根据周围像素进行预测),对图像进行最大程度的还原。比如一幅小图像重建为一幅大图像,

图像金字塔有两个高频出现的名词:上采样和下采样。现在说说他们俩。

  • 上采样:就是图片放大(所谓上嘛,就是变大),使用PryUp函数
  • 下采样:就是图片缩小(所谓下嘛,就是变小),使用PryDown函数

下采样将步骤:

  1. 对图像进行高斯内核卷积
  2. 将所有偶数行和列去除

下采样就是图像压缩,会丢失图像信息。

上采样步骤:

  1. 将图像在每个方向放大为原来的两倍,新增的行和列用0填充;
  2. 使用先前同样的内核(乘以4)与放大后的图像卷积,获得新增像素的近似值。

上、下采样都存在一个严重的问题,那就是图像变模糊了,因为缩放的过程中发生了信息丢失的问题。要解决这个问题,就得看拉普拉斯金字塔了。

下面给出OpenCV中pryUp和pryDown的用法。

  1. #include<opencv2\opencv.hpp>
  2. #include<opencv2\highgui\highgui.hpp>
  3. using namespace std;
  4. using namespace cv;
  5. //图像金字塔
  6. int main()
  7. {
  8. Mat img = imread("lol8.jpg");
  9. imshow("原始图", img);
  10. Mat dst,dst2;
  11. pyrUp(img, dst, Size(img.cols*2, img.rows*2)); //放大一倍
  12. pyrDown(img, dst2, Size(img.cols * 0.5, img.rows * 0.5)); //缩小为原来的一半
  13. imshow("尺寸放大之后", dst);
  14. imshow("尺寸缩小之后", dst2);
  15. waitKey(0);
  16. }

显然,无论是放大还是缩小,图像都变得模糊了,这就是他的致命缺点。

个人认为,要做缩放就用resize函数吧,毕竟方便太多而且图像不会变模糊!

OpenCV探索之路(五):图片缩放和图像金字塔的更多相关文章

  1. opencv —— resize、pyrUp 和 pyrDown 图像金字塔(高斯金字塔、拉普拉斯金字塔)与尺寸缩放(向上采样、向下采样)

    我们经常会将某种尺寸的图像转化为其他尺寸的图像,如果需要放大或者缩小图像的尺寸,在 OpenCV 中可以使用如下两种方法: resize 函数,最直接的方法. pyrUp 和 pyrDown 函数,即 ...

  2. OpenCV学习笔记(七) 图像金字塔 阈值 边界

    转自: OpenCV 教程 使用 图像金字塔 进行缩放 图像金字塔是视觉运用中广泛采用的一项技术.一个图像金字塔是一系列图像的集合 - 所有图像来源于同一张原始图像 - 通过梯次向下采样获得,直到达到 ...

  3. OpenCV计算机视觉学习(7)——图像金字塔(高斯金字塔,拉普拉斯金字塔)

    如果需要处理的原图及代码,请移步小编的GitHub地址 传送门:请点击我 如果点击有误:https://github.com/LeBron-Jian/ComputerVisionPractice 本节 ...

  4. OpenCV探索之路(十):图像修复技术

    在实际应用中,我们的图像常常会被噪声腐蚀,这些噪声或是镜头上的灰尘或水滴,或是旧照片的划痕,或者是图像遭到人为的涂画(比如马赛克)或者图像的部分本身已经损坏.如果我们想让这些受到破坏的额图片尽可能恢复 ...

  5. opencv 4 图像处理(漫水填充,图像金字塔与图片尺寸缩放,阈(yu)值化)

    漫水填充 实现漫水填充算法:floodFill函数 简单调用范例 #include <opencv2/opencv.hpp> #include <opencv2/imgproc/im ...

  6. OpenCV计算机视觉学习(13)——图像特征点检测(Harris角点检测,sift算法)

    如果需要处理的原图及代码,请移步小编的GitHub地址 传送门:请点击我 如果点击有误:https://github.com/LeBron-Jian/ComputerVisionPractice 前言 ...

  7. OpenCV图像金字塔:高斯金字塔、拉普拉斯金字塔与图片尺寸缩放

    这篇已经写得很好,真心给作者点个赞.题目都是直接转过来的,直接去看吧. Reference Link : http://blog.csdn.net/poem_qianmo/article/detail ...

  8. 【OpenCV新手教程之十三】OpenCV图像金字塔:高斯金字塔、拉普拉斯金字塔与图片尺寸缩放

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/26157633 作者:毛星云(浅墨) ...

  9. 学习 opencv---(12)OpenCV 图像金字塔:高斯金字塔,拉普拉斯金字塔与图片尺寸缩放

    在这篇文章里,我们一起学习下 图像金字塔 的一些基本概念,如何使用OpenCV函数pyrUp和pyrDown 对图像进行向上和向下采样,以及了解专门用于缩放图像尺寸的resize函数的用法.此博文一共 ...

随机推荐

  1. python学习随笔(三)

    在linux中输入密码,我们是看不到的,如果在python中直接输入是可以看的到的,执行以下程序 #!/usr/bin/env python username = raw_input("us ...

  2. String 类的实现(1)浅拷贝存在的问题

    浅拷贝 : 也称位拷贝 , 编译器只是直接将指针的值拷贝过来, 结果多个对象共用 同 一块内 存, 当一个对象将这块内 存释放掉之后, 另 一些对象不知道该块空间 已经还给了 系 统, 以 为还有效, ...

  3. Visual Studio 2017创建.net standard类库编译出错原因

    正式版上个月已经Release了,从那时到现在经常会收到更新提示,估计问题还不少吧!其中最吸引我的当然是.net standard与.net core. 刚好最近接触.net standard项目,新 ...

  4. 性能调优:mysql之left join

    poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq:908821478,咨询电话010-845052 ...

  5. Java集合总结系列2:Collection接口

    Collection 接口是 Java 集合类的一个根接口,Java 在 Collection 接口中定义了许多通用的数据操作类方法以及判断类方法. 通过查看 API 文档或源码的方式,我们可以了解到 ...

  6. windows server 定期备份数据库脚本

    将以下文件保存为.bat脚本,在计划任务中添加定时任务运行此脚本即可.脚本中的备份目录,数据库目录和压缩文件目录请自行修改. @echo off rem 当前路径切换到备份数据库目录 cd D:\wa ...

  7. 抽象工厂模式(Abstract Factory)

    (二)抽象工厂模式(Abstract Factory) 1.抽象工厂模式(Abstract Factory),提供了一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 2.抽象工厂模式是 ...

  8. JavaScript基础学习(四)—Object

    一.Object的基本操作 1.对象的创建      在JavaScript中,创建对象的方式有两种:构造函数和对象字面量.      (1)构造函数 var person = new Object( ...

  9. C#中的DateTime是值类型还是引用类型

    近期遇到了DateTime到底是值类型还是引用类型的疑惑,顺势较深入地了解一下DateTime相关的内容 结论:DateTime是值类型,因为DateTime是结构体,而结构体继承自Syste.Val ...

  10. Java线程池ThreadPoolExecutor使用和分析(三) - 终止线程池原理

    相关文章目录: Java线程池ThreadPoolExecutor使用和分析(一) Java线程池ThreadPoolExecutor使用和分析(二) - execute()原理 Java线程池Thr ...