我们经常会将某种尺寸的图像转化为其他尺寸的图像,如果需要放大或者缩小图像的尺寸,在 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. 虚拟机 ubuntu系统忘记密码如何进入

    重启 虚拟机 按住shift键 会出现下面的界面 按住‘e’进入下面的界面往下翻 更改红框勾到的字符串为:  rw init=/bin/bash 然后按F10进行引导 然后输入 :”passwd”  ...

  2. 办公环境下k8s网络互通方案

    在 kubernetes 的网络模型中,基于官方默认的 CNI 网络插件 Flannel,这种 Overlay Network(覆盖网络)可以轻松的实现 pod 间网络的互通.当我们把基于 sprin ...

  3. 机器学习在IC设计中的应用(二)--根据GBA时序结果来预测PBA

    本文转自:自己的微信公众号<集成电路设计及EDA教程> <机器学习在IC设计中的应用(二)--根据GBA时序结果来预测PBA> AOCV AOCV全称:Advanced OCV ...

  4. 7天用Go动手写/从零实现Web框架Gee

    设计一个框架 大部分时候,我们需要实现一个 Web 应用,第一反应是应该使用哪个框架.不同的框架设计理念和提供的功能有很大的差别.比如 Python 语言的 django和flask,前者大而全,后者 ...

  5. 宅在家学不进去吗?试试这些 GitHub 上简单易学的游戏项目吧

    作者:HelloGitHub-小鱼干 这是本人宅在家里的第 4 周,代码不想看,技术文章不想读,都不能愉快学习了我还怎么当一个优秀的需求消化师呢?有没有什么轻松地方法来学习技术呢?想起了小时候金山打字 ...

  6. 生成HTML测试报告表格

    #生成HTML测试报告 #-*- coding:utf-8 -*- from selenium import webdriver from selenium.webdriver.common.by i ...

  7. 题解 NOI2004【郁闷的出纳员】

    \[ Preface \] 之前用 treap 打,交了四遍才过. 自学了 fhq treap 后,才意识到是一道 fhq treap 板子题,直接码上,一遍就过. 本题解提供的是 fhq treap ...

  8. PBFT算法java实现

    PBFT 算法的java实现(上) 在这篇博客中,我会通过Java 去实现PBFT中结点的加入,以及认证.其中使用socket实现网络信息传输. 关于PBFT算法的一些介绍,大家可以去看一看网上的博客 ...

  9. 《Python编程:从入门到实践》分享下载

    书籍信息 书名:<Python编程:从入门到实践> 原作名:Python Crash Course 作者: [美] 埃里克·马瑟斯 豆瓣评分:9.1分(2534人评价) 内容简介 本书是一 ...

  10. How to Convert a Class File to a Java File?

    What is a programming language? Before introducing compilation and decompilation, let's briefly intr ...