序言: 继续,继续,开干!!!
本节学习OpenCV中的函数pyrUp和pyrDown对图像进行向上和向下采样,以及了解专门用于缩放图像尺寸的resize函数的用法

文章目录

  • 1、引言
  • 2、关于图像金字塔
  • 3、高斯金字塔
    • 3.1 对图像的向下采样(pyrDown()函数)
    • 3.2 对图像的向上取样(pyrUp()函数)
  • 4、拉普拉斯金字塔
  • 5、尺寸调整:resize()函数

1、引言

如果想要将某种尺寸的图像转换为其他尺寸的图像:如放大或者缩小

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

2、关于图像金字塔

图像金字塔是图像中多尺寸表达的一种,最主要用于图像的分割,是一种以多分辨率来解释图像的有效但概念简单的结构。

图像金字塔最初用于机器视觉和图像压缩,一幅图像的金字塔是一系列以金字塔形状排列的,分辨率逐步降低且来源于同一张原始图的图像集合。其通过梯次向下采样获得,直到达到某个终止条件才停止采样。

如下:层级越高,则图像越小,分辨率越低。

一般情况下有两种类型的图像金字塔常常出现在文献和以及实际运用中,它们分别是:

  • 高斯金字塔(Gaussianpyramid)——用来向下采样,主要的图像金字塔
  • 拉普拉斯金字塔(Laplacianpyramid)——用来从金字塔底层图像重建上层未采样图像,在数字图像处理中也即是预测残差,可以对图像进行最大程度的还原,配合高斯金字塔一起使用。

区别:高斯金字塔用来向下降采样图像,而拉普拉斯金字塔则用来从金字塔底层图像向上采样,重建一个图像。

内容:要从金字塔第i层生成第i+1层(第i+1层表示G i+1),我们先要用高斯核对Gi进行卷积,然后删除除所有偶数行和偶数列,新得到图像面积会变为源图像的四分之一。按照上述过程对输入图像G0执行操作就可以参数整个金字塔。当图像向金字塔的上层移动的时,尺寸和分辨率会降低。从金字塔中上一级图像生成下一级图像的可以用PryDown,而通过PryUp将现有的图像在每个维度都放大两遍

总之:上述讲述的向下与向上采样,是针对图像的尺寸而言的(与金字塔的方向相反),向上就是图像的尺寸加倍,向下就是图像的尺寸减半。

  • (1)对图像向上采样——pyrUp函数:不是降采样逆操作。图像首先在每个维度上扩大为原来的两倍,新增的行(偶数行)以0填充。然后给指定的滤波器进行卷积(实际是一个在每个维度都扩大为原来两倍的过滤器)去估计“丢失”像素的近视值。
  • (2)对图像向下采样——pyrDown函数:是一个不会丢失信息的函数。为了恢复原来更高的分辨率图像,获得由降采样操作丢失的信息。

3、高斯金字塔

说明: 高斯金字塔是通过高斯平滑和亚采样获得一系列采样图像,也就是说第K层高斯金字塔通过平滑、亚采样就可以获得K+1层高斯图像。高斯金字塔包含了一系列低通滤波器,其截至频率从上一层到下一层以因子2逐渐增加,所以高斯金字塔可以跨越很大的频率范围。

补充:亚采样:就是下采样。对于序列来说,就是按固定间隔地抽取原序列,获得新序列。新序列是原序列的子序列。对于图像来说,也类似。比如256256的图像,进行一次间隔为2的下采样,就变成了128128的子图像,再来一次,就变成了64*64,依此类推。。说白了,采样也好,采样也好,都是只取原序列或者原图像的一部分数据,至于取的方法就很多了。。

3.1 对图像的向下采样(pyrDown()函数)

为获取层级为Gi+1的金字塔图像,采用如下方法:

(1)对图像Gi进行高斯内核卷积

(2)将所有偶数行和列去除

得到的图像即为Gi+1的图像,显而易见,结果图像只有原图的四分之一。通过对输入图像Gi(原始图像)不停迭代以上步骤就会得到整个金字塔。

void pyrDown(InputArray src,OutputArray dst,const Size &dstszie=Size(),int borderType=BORDER_DEFAULT);
  • 第一个参数:输入图像,即源图像,填Mat类的对象即可

  • 第二个参数:输出图像,和源图像有一样的尺寸和类型

  • 第三个参数:输出图像的大小;有默认值Size(),即默认情况下,又Size Size((src.cols+1)/2,(src.rows+1)/2)来进行计算,且一直需要满足下列条件:

  • 第四个参数:边界模式
#include<opencv2/opencv.hpp>
#include<opencv2/imgproc/imgproc.hpp>
using namespace cv;
int main()
{//载入原始图Mat srcIamge = imread("E:\\Pec\\雷神.jpg");Mat tmpImage, dstImage;//临时变量和目标图定义tmpImage = srcIamge;//将原始图赋给临时变量//显示原图像imshow("【原始图】", srcIamge);//进行向下采样操作pyrDown(tmpImage, dstImage, Size(tmpImage.cols / 2, tmpImage.rows / 2));//显示效果图imshow("【效果图】", dstImage);waitKey(0);
}

3.2 对图像的向上取样(pyrUp()函数)

说明:如果想放大图像,则需通过向上取样操作得到

(1)将图像在每个方向扩大为原来的两倍,新增的行和列以0填充

(2)使用先前同样的内核(乘以4)与放大后的图像卷积,获得“新增像素”的近视值

为得到图像即为放大后的图像,但与原来的图像相比会发觉比较模糊,因为在放缩的过程中已经丢失了一些信息。

void pyrUp(InputArray src,OutputArray dst,const Size &dstsize=Size(),int borderType=BORDER_DEFAULT);
  • 第一个参数:输入图像,即源图像,填Mat类的对象即可

  • 第二个参数:输出图像,和源图像有一样的尺寸和类型

  • 第三个参数:输出图像的大小,有默认值Size(),即默认情况下,由Size(src.cols* 2,src.rows *2)来进行计算,且需要满足以下条件:

  • 第四个参数:边界模式

示例:

#include<opencv2/opencv.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<iostream>
using namespace std;
using namespace cv;
int main()
{//载入原始图Mat srcIamge = imread("E:\\Pec\\雷神.jpg");Mat tmpImage, dstImage,dstImage1;//临时变量和目标图定义tmpImage = srcIamge;//将原始图赋给临时变量//显示原图像imshow("【原始图】", srcIamge);//进行向下采样操作pyrUp(tmpImage, dstImage, Size(tmpImage.cols*2, tmpImage.rows*2));cout << tmpImage.cols << endl;//显示效果图imshow("【效果图】", dstImage);waitKey(0);
}

确实有点模糊:

4、拉普拉斯金字塔

拉普拉斯金字塔第i层的数学定义:

公式说明:Gi表示第 i 层的图像,而UP()操作是将源图像中位置为(x,y)的像素映射到目标图像的(2 *x+1,2 * y+1)位置,即在进行向上取样。符号x表示卷积,g 5x5为5x5的高斯内核。

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

5、尺寸调整:resize()函数

说明:此函数将源图像精确地转换为指定尺寸的目标图像。如果源图像中设置了ROI,那么resize()函数会对源图像的ROI区域进行调整图像尺寸的操作,来输出到目标图像中。

void resize(InputArray src,OutputArray dst,Size dsize,double fx=0,double fy=0,
int interpolation=INTER_LINEAR);
  • 第一个参数:输入图像,即源图像,填Mat类的对象即可

  • 第二个参数:输出图像,当其非零时,有着dsize的尺寸,或者由src.size()计算出来

  • 第三个参数:输出图像的大小。如果它等于零,由下士计算:
    d s i z e = S i z e ( r o u n d ( f x ∗ s r c . c o l s ) , r o u n d ( f y ∗ s r c . r o w s ) ) dsize=Size(round(fx*src.cols),round(fy*src.rows)) dsize=Size(round(fx∗src.cols),round(fy∗src.rows))
    其中,disize、fx、fy都不能为0

  • 第四个参数:沿水平轴的缩放系数,有默认值0,且当其等于0时,由下式计算
    ( d o u b l e ) d s i z e . w i d t h / s r c . c o l s (double)dsize.width/src.cols (double)dsize.width/src.cols

  • 第五个参数:沿垂直轴的缩放系数,有默认值0,且当其等于0时,由下式计算
    ( d o u b l e ) d s i z e . h e i g h t / s r c . r o w s (double)dsize.height/src.rows (double)dsize.height/src.rows

  • 第六个参数:用于指定插值方式,默认值为INTER_LINEAR(线性插值)

    可选的插值方式如下:

    (1)INTER_NEAREST——最近邻插值

    (2)INTER_LINEAR——线性插值(默认值)

    (3)INTER_AREA——区域插值(利用像素区域关系的重采样插值)【缩小图像选择】

    (4)INTER_CUBIC——三次样条插值(超过4x4像素邻域内的双三次插值)【放大图像】【效率慢】

    (5)INTER_LANCZOS4—Lanczos插值(超过8x8像素邻域的Lanczos插值)【放大图像】【效率高】

示例程序:

#include<opencv2/opencv.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<iostream>
using namespace std;
using namespace cv;
int main()
{//载入原始图Mat srcIamge = imread("E:\\Pec\\雷神.jpg");Mat tmpImage, dstImage,dstImage1;//临时变量和目标图定义tmpImage = srcIamge;//将原始图赋给临时变量//显示原图像imshow("【原始图】", srcIamge);//进行尺寸调整操作resize(tmpImage, dstImage, Size(tmpImage.cols / 2, tmpImage.rows / 2), 0, 0, 3);resize(tmpImage, dstImage1, Size(tmpImage.cols *2, tmpImage.rows * 2), 0, 0, 3);//显示效果图imshow("【效果图】之一", dstImage);imshow("【效果图】之二", dstImage1);waitKey(0);
}

【OpenCV】—图像金子塔与图片尺寸缩放相关推荐

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

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

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

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

  3. 《OpenCV3编程入门》学习笔记6 图像处理(六)图像金字塔与图片尺寸缩放

    6.6 图像金字塔与图片尺寸缩放 6.6.1 图像金字塔 1.图像金字塔是图像中多尺度表达的一种,主要用于图像分割,是一种以多分辨率解释图像的结构,通过梯次向下采样获得分辨率逐步降低的图象集合 2.分 ...

  4. 在线修改图片尺寸缩放网站(完美解决图片过大无法上传问题)

    在线修改图片尺寸缩放网站(完美解决图片过大无法上传问题) http://pic.sdodo.com/tool/picadjust/ http://www.zhengzong.cn/bbsxp/thre ...

  5. OpenCV3.0中的图像金字塔与图片尺寸缩放

    图像金字塔是图像中多尺度表达的一种,最主要用于图像分割,是一种以多分辨率来解释图像的有效但概念简单的结构.一幅图像的金字塔式一系列以金字塔形状排列的,分辨率逐步降低且来源于同一张原始图的图像集合.其通 ...

  6. python 高斯金字塔_12、高斯金字塔、拉普拉斯金字塔与图片尺寸缩放(示例代码)...

    一.引言 我们经常会将某种尺寸的图像转换为其他尺寸的图像,如果放大或者缩小图片的尺寸,笼统来说的话,可以使用OpenCV为我们提供的如下两种方式: (1)resize函数.这是最直接的方式, (2)p ...

  7. Python 图片尺寸缩放的4种方式

    微信公众号" 程序猿刘先森", 共同学习- https://darylliu.github.io/archives/9c4cfe08.html 最近由于网站对图片尺寸的需要,用py ...

  8. android 图片自动裁剪图片大小,android调用原生图片裁剪后图片尺寸缩放的解决方法...

    在安卓开发中,如果对拍照后的图片进行图片裁剪,如果是调用系统的裁剪,如下: /* * 裁剪图片 */ private void cropPhoto() { Intent intent = new In ...

  9. OpenCV 图片尺寸缩放——resize函数

    文章目录 OpenCV中的缩放: resize函数 代码案例 OpenCV中的缩放: 如果要放大或缩小图片的尺寸,可以使用OpenCV提供的两种方法: resize函数,是最直接的方式: pyrUp, ...

最新文章

  1. group_concat 不是可以识别的 内置函数名称。_Python 函数库 APIs 编写指南
  2. 沉浸式ui设计_有助于沉浸的视频游戏UI —武器轮
  3. ACM-ICPC中博弈论的一些小小总结
  4. html新建通用loading,漂亮实用的页面loading(加载)封装代码
  5. testVC.modalPresentationStyle = UIModalPresentationFormSheet; 更改 VC大小
  6. Java多线程同步数据库,源码+原理+手写框架
  7. linux nginx支持socket,nginx配置websocket转发功能
  8. linux输入法_惊奇软件:这是我见过最有【态度】的输入法!
  9. Excel工作表丨使用Excel表格直接添加条码/二维码
  10. 详细的log4j配置使用流程
  11. 【JS】利用JS给删除按钮添加提示框
  12. win7搭建VM10虚拟机,搭建win7旗舰版64系统
  13. 从西直门立交桥谈IT架构与重构(干货)
  14. 华为交换机忘记密码、修改密码、重置密码
  15. 计算机采用的编码机制是什么,编码机制
  16. linux sda sdb 问题 .
  17. Hive查询系列之初相识
  18. itchat+在线聊天机器人接口实现微信聊天机器人
  19. C#错误:CS0012 未能加载文件或程序集“netstandard, Version=2.0.0.0, Culture=neutral解决方案
  20. Linux效劳器的零碎内存监控方法详细解析-2

热门文章

  1. php带省略号的分页
  2. linux查看根目录下的目录结构,Linux根目录下的文件结构
  3. dom4j在指定位置添加标签更新标签
  4. 微信壁纸小程序+头像挂件+头像
  5. OpenCV-Python 图像平滑处理2:blur函数及滤波案例
  6. android github 开源的图片剪辑库使用效果记录
  7. Selenium安装教程
  8. steamdb免费游戏信息爬取(不是爬虫教学,日常记录,贼不工整,不喜勿看)
  9. charles 黑名单
  10. python爬微博数据合法吗_Python 免登录微博数据爬虫(仅研究使用)