【opencv学习笔记】014之上采样与降采样

目录

一、前言

二、图像金字塔

1、聊个题外话

2、图像金字塔

3、上采样与降采样

1.高斯金字塔

2.高斯不同

3.拉普拉斯金字塔

4.API

5.代码展示

6.执行结果

7.先降采样再上采样

8.执行结果


一、前言

继续填坑。

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

【OpenCV系列】:https://blog.csdn.net/shuiyixin/article/category/7581855

如果你想了解更多有关于计算机视觉、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<iostream>
#include<opencv2/opencv.hpp>

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<iostream>
#include<opencv2/opencv.hpp>

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多高逼格对吧!

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

发布了255 篇原创文章 · 获赞 510 · 访问量 51万+

猜你喜欢

转载自blog.csdn.net/shuiyixin/article/details/104415952