博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【opencv学习笔记】014之上采样与降采样
阅读量:4074 次
发布时间:2019-05-25

本文共 2822 字,大约阅读时间需要 9 分钟。

目录


一、前言

继续填坑。

如果想看其他有关于OpenCV学习方法介绍、学习教程、代码实战、常见报错及解决方案等相关内容,可以直接看我的OpenCV分类:

如果你想了解更多有关于计算机视觉、OpenCV、机器学习、深度学习等相关技术的内容,想与更多大佬一起沟通,那就扫描下方二维码加入我们吧!

 

二、图像金字塔

1、聊个题外话

大家对金字塔的印象是什么。

欢迎大家评论。对于我来说,金字塔的印象:

迪迦出现的地方
法老的陵墓

 

2、图像金字塔

不管是那种金字塔,说白了都是四棱锥,大家看下图:

这个也可以看做金字塔,如果我们把一个小方格当成一个二值图像的像素,那么我们可以从最底层变到最高层,也可以从最高层变到最底层。那如果这是一个图像的话,从上往下,我们就实现了图像的放大,从下往上就实现了图像的缩小。

所以在图像中,我们可以利用这样的四棱锥进行进行图像的缩放,我们将这个四棱锥称之为:图像金字塔

而图像的放大与缩小分别称之为上采样降采样或下采样

 

3、上采样与降采样

通过上面,我们知道,

上采样就是放大图像,通过放大图像,我们可以增加图像的像素,从而可以得到更高的分辨率。

降采样就是缩小图像,通过缩小图像,我们可以减少图像的像素,一方面,我们可以生成对应图像的缩略图,另一方面,我们可以减少图像的大小,节约内存。

但是我们通过上采样的得到的图,和经过缩小的图像的原图还是有区别的,因为我们很难真正获得图像的原始位置的像素,所以通过上采样得到的图,可能会看着不是那么清晰,那么流畅,图像质量不是那么的好。

接下来我们着重讲两个图像金字塔:高斯金字塔拉普拉斯金字塔

1.高斯金字塔

高斯金字塔是从底向上,用于对图像进行降采样。高斯金字塔对原图像删除偶数行与列,即得到降采样之后上一层的图片。所以经过一次高斯金字塔,图像的行列变为原来的1/2 。

具体的步骤分为两步:

1.进行高斯模糊

2.删除当前层的偶数行与列。

2.高斯不同

把同一张图像在不同的参数下做高斯模糊之后的结果相减,得到的输出图像。称为高斯不同(Difference of Gaussian-DOG)。

高斯不同是图像的内在特征,在灰度图像增强、角点检测中经常用到。

 

3.拉普拉斯金字塔

拉普拉斯金字塔很高斯金字塔不同,是用其上层的图像,获得其下层的图像,比如我们可以通过高斯金字塔进行图像的降采样,然后我们可以使用拉普拉斯金字塔进行图像的上采样。

 

4.API

图像的上采样API如下:

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

函数参数含义如下:

(1)InputArray类型的src ,输入图像。

(2)OutputArray类型的dst ,输出图像,图像的大小是规定的(根据参数3)和输入图像有相同的类型。

(3)Size类型的指针dstsize ,设定的输出图像大小。

(4)int类型的borderType ,像素外推方法,请参见cv::BorderTypes(仅支持BORDER_DEFAULT)。

图像的降采样API如下:

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

函数参数含义如下:

(1)InputArray类型的src ,输入图像。

(2)OutputArray类型的dst ,输出图像,图像的大小是规定的(根据参数3)和输入图像有相同的类型。

(3)Size类型的指针dstsize ,设定的输出图像大小。

(4)int类型的borderType ,像素外推方法,请参见cv::BorderTypes(仅支持BORDER_DEFAULT)。

上采样函数和降采样函数的图像一般在使用过程中,我们只设置前三个参数。

5.代码展示

讲完API,我们看一个具体的例子。

#include
#include
using namespace std;using namespace cv;int main(){ Mat img, src; img = imread("E:/image/girl3.png"); if (!img.data) { cout << "could not load image !"; return -1; } imshow("show img", img); pyrUp(img, src, Size(img.cols * 2, img.rows * 2)); imshow("output up image", src); pyrDown(img, src, Size(img.cols/2, img.rows/2)); imshow("output down image", src); waitKey(0); return 0;}

6.执行结果

原图
降采样后的图像

 

上采样后的图像

我们发现,通过上采样的图像,除了尺寸变大,还变得模糊了。那我们可以尝试一下,先通过降采样,再进行上采样会如何呢?

7.先降采样再上采样

讲完API,我们看一个具体的例子。

#include
#include
using namespace std;using namespace cv;int main(){ Mat img; img = imread("E:/image/girl3.png"); if (!img.data) { cout << "could not load image !"; return -1; } imshow("show img", img); pyrDown(img, img, Size(img.cols / 2, img.rows / 2)); pyrUp(img, img, Size(img.cols * 2, img.rows * 2)); imshow("output down image", img); waitKey(0); return 0;}

8.执行结果

原图
先降采样再上采样

 

朦胧的感觉,哈哈是不是以后我们想让图片有朦胧美的时候就不用再用PS了呢,用opencv多高逼格对吧!

今天的内容就讲到这里啦,希望大家能够多多练习,才能真正学懂啊!

转载地址:http://lzyni.baihongyu.com/

你可能感兴趣的文章
服务器病毒问题解决- 阿里云 挖矿病毒,Circle_MI.png
查看>>
mysql命令gruop by报错this is incompatible with sql_mode=only_full_group_by
查看>>
url编码实践
查看>>
escape encodeuri encodeURIComponent 区别
查看>>
git 分支修改bug应用场景
查看>>
git .gitignore失效的解决办法
查看>>
Spring JdbcTemplate 两种方法的区别
查看>>
homebrew 安装 mpv
查看>>
由一个bug 引出的 hibernate 三种状态
查看>>
mysql使用kill命令解决死锁问题,杀死某条正在执行的sql语句
查看>>
通过HttpURLConnection 上传文件
查看>>
redistemplate事务实践
查看>>
redistemplate 乐观锁实践
查看>>
解決 java.security.cert.CertificateException: Certificates does not conform to algorithm constraints
查看>>
Exception自定义处理模型
查看>>
checked exception和runtime exception and error
查看>>
Spring基于xml的构造方法注入&setter注入
查看>>
Zookeeper 安装和配置
查看>>
netty rpc 方面demo 调研
查看>>
zookeeper 负载均衡 概念笔记
查看>>