我们经常会将某种尺寸的图像转化为其他尺寸的图像,如果需要放大或者缩小图像的尺寸,在 OpenCV 中可以使用如下两种方法:

  • resize 函数,最直接的方法。
  • pyrUp 和 pyrDown 函数,即图像金字塔相关的两个函数,对图像进行向上采样和向下采样的操作。

pyrUp 和 pyrDown 其实和专门用于放大缩小图像尺寸的 resize 在功能上差不多,批着图像金字塔的皮,说白了还是对图像进行放大和缩小操作。

图像金字塔

  • 一幅图像的金字塔是一系列以金字塔形状排列,分辨率逐渐降低且源于同一张原始图的图像集合。金字塔的底部是待处理图像的高分辨率表示,而顶部是低分辨率的近似。层级越高,图像越小,分辨率越低。

  • 图像金字塔是图像中多尺度表达的一种,最初用于机器视觉和图像压缩,最主要功能用于图像分割,是一种以多分辨率来解释图像的有效但概念简单的结构。

向上、向下采样

图像金字塔中的向上和向下采样分别通过 pyrUp 和 pyrDown 实现。这里的向上向下采样,是针对图像的尺寸而言的(和金字塔的方向相反),向上就是图像尺寸加倍,向下就是图像尺寸减半。但需要注意的是,pyrUp 和 pyrDown 不是互逆的。

  • 对于 pyrUp,图像首先在每个维度上扩大为原来的两倍,新增的行和列(偶数行和列)以 0 填充。然后用指定的滤波器进行卷积(实际上是一个在每个维度上都扩大为原来两倍的过滤器)去估计”丢失“像素的近似值。
  • 对于 pyrDown,我们先要用高斯核对图像进行卷积,然后删除所有偶数行和偶数列,新的到的图像面积就会变成源图像的四分之一。

高斯金字塔

高斯金字塔是通过高斯平滑和亚采样获得的一系列采样图像。

  • 向下采样方法:① 对图像进行高斯内核卷积;② 将所有偶数行和列去除。
  • 向上采样方法:① 将图像在每个方向上扩大为原来的两倍,新增的行和列以 0 填充;② 使用原先同样的内核(乘以 4)与放大后的图像卷积,获得”新增像素“的近似值。在缩放过程中已经丢失了一些信息,如果想在缩放过程中减少信息的丢失,就需要用到拉普拉斯金字塔。

拉普拉斯金字塔

拉普拉斯金字塔是通过源图像减去先缩小再放大的图像的一系列图像构成。

数学定义:Li = Gi — pryUp( Gi+1 g5×5

尺寸调整:resize 函数

此函数将源图像精确地转换为指定尺寸地目标图像。如果源图像中设置了 ROI(感兴趣区域),那么 resize() 函数就会对源图像地 ROI 区域进行调整尺寸操作,来输出到目标图像中。若目标图像中已经设置了 ROI 区域,不难理解 resize() 函数将会对源图像进行尺寸调整并填充到目标图像的 ROI 区域中去。

void resize(InputArray src, OutputArray dst, Size dsize, double fx = 0, double fy = 0, int interpolation = INTER_LINEAR);

  • src,输入图像,Mat 类对象即可。
  • dst,输出图像,若其非零时,有着 dsize 的尺寸,或者由 src.size() 计算出来。
  • dsize,输出图像的尺寸。如果它等于零,由如下公式进行计算:

dsize = Size ( round ( fx * src.cols ), round( fy * src.rows ) );

  • fx,延水平轴的缩放系数,有默认值 0,且为 0 时,由下式进行计算:

fx = (double) dsize.width / src.cols

  • fy,延垂直轴的缩放系数,有默认值 0,为 0 时,由下式进行计算:

fy = (double) dsize.height / src.rows

  • interpolation,指定插值方式,默认为 INTER_LINEAR (线性插值)。插值就是根据已知数据点(条件),来预测未知数据点值得方法。在尺寸调整过程中,图像的大小可能发生改变。此时像素与像素之间的关系就不是一一对应关系,因此在尺寸调整过程中,可能会涉及到像素值的插值计算。可选插值方式如下:

    • INTER_NEAREST(最近邻差值)
    • INTER_LINEAR(线性插值,默认)
    • INTER_AREA(区域插值,利用像素区域关系的重采样插值)
    • INTER_CUBIC(三次样条插值,超过 4×4 像素邻域内的双三次插值)
    • INTER_LANCZOS4(Lanczos 插值,超过 8×8 像素邻域的 Lanczos 插值)

若要缩小图像,一般情况下最好用 INTER_AREA 来插值;若要放大图像,一般情况下用 INTER_LINEAR。

代码示例:

#include <opencv.hpp>
using namespace cv;
int main() {
Mat src = imread("C:/Users/齐明洋/Desktop/证件照/7.jpg");
imshow("src", src); //方法一
Mat dst1 = Mat(, , CV_8UC3);
resize(src, dst1, dst1.size());
imshow("dst1", dst1); //方法二
Mat dst2;
resize(src, dst2, Size(), 0.5, 0.5);
imshow("dst2", dst2);
waitKey();
}

效果演示:

向上采样:pyrUp 函数

pyrUp 函数的作用是向上采样并模糊一张图像,说白了就是放大一张图片。

void pyrUp(InputArray src, OutputArray dst, const Size& dstsize = Size(), int borderType = BORDER_DEFAULT);

  • src,输入图像,即源图像,Mat 类的对象即可。
  • dst,输出图像。
  • dstsize,输出图像的大小,有默认值 Size(),默认情况下,由 Size(src.cols * 2, src.rows * 2) 来进行计算
  • borderType,边界扩展的方式,一般不考虑,选择默认值。

向下采样:pyrDown 函数

pyrDown 函数的作用是向下采样并模糊一张图像,说白了就是缩小一张图片。

void pyrDown(InputArray src, OutputArray dst, const Size& dstsize = Size(), int borderType = BORDER_DEFAULT);

  • src,输入图像,即源图像,Mat 类的对象即可。
  • dst,输出图像。
  • dstsize,输出图像的大小,有默认值 Size(),默认情况下,由 Size( (src.cols + 1) / 2, (src.rows + 1) / 2 ) 来进行计算
  • borderType,边界扩展的方式,一般不考虑,选择默认值。

代码示例:

#include <opencv.hpp>
using namespace cv;
int main() {
Mat src = imread("C:/Users/齐明洋/Desktop/证件照/7.jpg");
imshow("src", src); Mat up_img, down_img;
pyrUp(src, up_img);
pyrDown(src, down_img);
imshow("up_img", up_img);
imshow("down_img", down_img); waitKey();
}

效果演示:

opencv —— resize、pyrUp 和 pyrDown 图像金字塔(高斯金字塔、拉普拉斯金字塔)与尺寸缩放(向上采样、向下采样)的更多相关文章

  1. 机器学习进阶-图像金字塔与轮廓检测-图像金字塔-(**高斯金字塔) 1.cv2.pyrDown(对图片做向下采样) 2.cv2.pyrUp(对图片做向上采样)

    1.cv2.pyrDown(src)  对图片做向下采样操作,通常也可以做模糊化处理 参数说明:src表示输入的图片 2.cv2.pyrUp(src) 对图片做向上采样操作 参数说明:src表示输入的 ...

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

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

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

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

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

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

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

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

  6. OpenCV笔记(3)(Canny边缘检测、高斯金字塔、拉普拉斯金字塔、图像轮廓、模板匹配)

    一.Canny边缘检测 Canny边缘检测是一系列方法综合的结果.其中主要包含以下步骤: 1.使用高斯滤波器,平滑图像,滤除噪声. 2.计算图像中每个像素点的梯度强度和方向. 3.应用非极大值抑制(N ...

  7. Python 图像处理 OpenCV (14):图像金字塔

    前文传送门: 「Python 图像处理 OpenCV (1):入门」 「Python 图像处理 OpenCV (2):像素处理与 Numpy 操作以及 Matplotlib 显示图像」 「Python ...

  8. SSE图像算法优化系列二十九:基础的拉普拉斯金字塔融合用于改善图像增强中易出现的过增强问题(一)

    拉普拉斯金字塔融合是多图融合相关算法里最简单和最容易实现的一种,我们在看网络上大部分的文章都是在拿那个苹果和橙子融合在一起,变成一个果橙的效果作为例子说明.在这方面确实融合的比较好.但是本文我们主要讲 ...

  9. Python+OpenCV图像处理(十一)—— 图像金字塔

    简介:图像金字塔是图像中多尺度表达的一种,最主要用于图像的分割,是一种以多分辨率来解释图像的有效但概念简单的结构.简单来说,图像金字塔就是用来进行图像缩放的. 进行图像缩放可以用图像金字塔,也可以使用 ...

随机推荐

  1. 响应国家号召,在家撸码之React迁移记

    最近这段时间新型冠状病毒肆虐,上海确诊人数每天都在增加,人人提心吊胆,街上都没人了.为了响应国家号召,近期呆在家里撸码,着手将项目迁移到React中,项目比较朴素,是一张线索提交页面,包含表单.图片滚 ...

  2. SpringBoot + Mybatis 和ssm 使用数据库的区别

    积少成多 ----  仅以此致敬和我一样在慢慢前进的人儿 相关内容: https://www.cnblogs.com/h-c-g/p/10252121.html 引 言 接触SpringBoot 后, ...

  3. python人脸识别

    需要掌握知识python,opencv和机器学习一类的基础 过一段时间代码上传github,本人菜j一个,虽然是我自己谢的,也有好多不懂,或者我这就是错误方向 链接:https://pan.baidu ...

  4. Linux文件和目录权限实战讲解

    一 相关课程回顾1.1 linux文件类型当执行ls -l或ls -la 命令后显示的结果中最前面的第2~10个字符是用来表示文件权限 第一个字符一般用来区分文件和目录: d:表示是一个目录,事实上在 ...

  5. 自学Java第一章——《Java概述》

    1.1 Java历史 Java诞生于SUN(Stanford University Network),09年SUN被Oracle(甲骨文)收购. Java之父是詹姆斯.高斯林(James Goslin ...

  6. 加快Chrome网页开启速度

    谷歌浏览器一直是众多大神心中的最爱,但是对于启动速度还是有一些纠结,这里找到一个好方法可以加快一些启动的速度,亲测有效. 1.地址栏输入chrome://flags: 2.启用"覆盖软件渲染 ...

  7. 使用PyCharm创建并运行一个Python项目

    (1)首先,在欢迎界面点击“Create New Project”: (2)在“New Project“左侧面板点击”Pure Python“,右侧Location选择自己要创建项目的路径(一般情况, ...

  8. Codeforces_712_A

    http://codeforces.com/contest/712/problem/A 水题,写出来就看到规律了. #include<iostream> #include<cstri ...

  9. False注入,以及SQL注入技巧总结

    title: False注入,以及SQL注入技巧总结 date: 2017-04-25 00:23:31 tags: ['SQL注入'] --- 利用False我们可以绕过一些特定的WAF以及一些未来 ...

  10. Integer缓存机制-基本数据类型和包装类型-自动拆装箱

    Integer缓存机制 总结: 1.jdk1.5对Integer新增了缓存机制,范围在-128-127(这个范围的整数值使用频率最高)内的自动装箱返回的是缓存对象,不会new新的对象,所以只要在缓存范 ...