OpenCV计算机图像视觉基础学习笔记6——图像的上采样和降采样

上采样与降采样是用来放大和缩小图片的操作。


图像金字塔

图像金字塔是图像多尺度表达的一种,是一种以多分辨率来解释图像的有效但概念简单的结构。一幅图像的金字塔是一系列以金字塔形状排列的分辨率逐步降低,且来源于同一张原始图的图像集合。其通过梯次向下采样获得,直到达到某个终止条件才停止采样。我们将一层一层的图像比喻成金字塔,层级越高,则图像越小,分辨率越低。

——摘自百度百科“图像金字塔”

这是一个简单的示意图。

简单来讲,当图像从顶向下进行采样时,由于包含的色块增多,分辨率就会逐步提高,这便是放大图片的效果,称为上采样。相反的,当图像从底向上进行采样时,分辨率就会逐步降低,这便是缩小图片的效果,称为降采样。

高斯金字塔多用于降采样。它是从底向上,逐层采样得到。降采样之后图像的大小是原图像的四分之一(长宽都变为原来的一半),在实现上是对原图像删除偶数行和偶数列即可。它的生成过程分为两步。首先对整张图片进行高斯模糊,然后删除当前层的偶数行和偶数列,即可得到上一层的图像。

此外,还有拉普拉斯采样。

拓展概念:高斯不同(Difference of Gaussian,DOG)就是把同一张图像在不同的参数下做高斯模糊之后的结果相减,得到的输出图像,这样的图像称为高斯不同。高斯不同是图像的内在特征,在灰度图像增强,角点检测中经常用到。

相关API:

1
2
3
4
pyrUp(Mat src, Mat dst, Size(src.cols*2, src.rows*2));
// 上采样,生成的图像是原来的四倍大小,长宽各自变为原来的二倍
pyrDown(Mat src, Mat dst, Size(src.cols*2, src.rows*2));
// 降采样,生成的图像是原来的四分之一大小,长宽各自变为原来的二分之一

放大图像测试:

缩小图像测试:

源代码(缩小):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <opencv2/opencv.hpp>
#include <iostream>
#define debug cout << "ok" << endl;

using namespace cv;
using namespace std;

Mat src, dst;
char input_title[] = "input image";
char output_title[] = "output image";


int main() {
src = imread("D:/pics/cover.jpg");
if (!src.data) {
cout << "could not load image..." << endl;
return -1;
}
imshow(input_title, src);
pyrDown(src, dst, Size(src.cols / 2, src.rows / 2));
imshow(output_title, dst);

waitKey(0);
return 0;
}

通过上采样和降采样操作后得到高斯不同(DOG):

在源代码中使用了两个新的API,一个是substract,另一个是normalizesubstract顾名思义是进行相减操作,而normalize的作用比较不明确,bing查得其作用为归一化输入数组,使它的范数或者数值范围在一定的范围内。它支持多种归一化类型,其中这里用的是NORM_MINMAX, 数组的数值被平移或缩放到一个指定的范围,线性归一化,一般较常用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <opencv2/opencv.hpp>
#include <iostream>
#define debug cout << "ok" << endl;

using namespace cv;
using namespace std;

Mat src, srcUp, srcDown;
char input_title[] = "input image";
char Up_title[] = "srcUp image";
char Down_title[] = "srcDown image";
char DOG_title[] = "DOG image";


int main() {
src = imread("D:/pics/cover.jpg");
if (!src.data) {
cout << "could not load image..." << endl;
return -1;
}
imshow(input_title, src);

pyrDown(src, srcDown, Size(src.cols / 2, src.rows / 2));
imshow(Down_title, srcDown);

pyrUp(src, srcUp, Size(src.cols * 2, src.rows * 2));
imshow(Up_title, srcUp);

Mat gray_src, g1, g2, dogImg;
cvtColor(src, gray_src, CV_BGR2GRAY);
GaussianBlur(gray_src, g1, Size(3, 3), 0, 0);
GaussianBlur(g1, g2, Size(3, 3), 0);
subtract(g1, g2, dogImg, Mat());
normalize(dogImg, dogImg, 255, 0, NORM_MINMAX);
imshow(DOG_title, dogImg);

waitKey(0);
return 0;
}

注意到当Size()的取值变大时,高斯不同操作结果后的图像轮廓越清晰。


-------------本文结束,感谢您的阅读转载请注明原作者及出处-------------


本文标题:OpenCV计算机图像视觉基础学习笔记6——图像的上采样和降采样

文章作者:Shawn Zhou

发布时间:2019年08月05日 - 08:08

最后更新:2019年08月07日 - 14:08

原始链接:http://shawnzhou.xyz/2019/08/05/19-08-05-01/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

知识无价,码字不易。对您有用,敬请打赏。金额随意,感谢关心。
0%