opencv实现了用于创建图像金字塔的两个函数pyrDown()和pryUp()
图像金字塔是一种经典的图像多尺度描述方法,它将降采样和平滑滤波结合在一起,对图像进行多尺度表示。图像金字塔由不同尺寸的图像叠加而成,通常每一层的尺寸都是上一层的一半这种处理技术的意义在于:我们在对图像进行处理时,大多是要着眼于图像中有意义的部分,而同一幅图像中可能含有不同尺度下“有意义”的信息,为了充分利用这些图像信息,就需要对图像进行多尺度描述了。
pyrDown()
从一个高分辨率大尺寸的图像向上构建一个金字塔(尺寸变小,分辨率降低)
函数原型:
pyrDown(src, dst=None, dstsize=None, borderType=None)
先对图像进行高斯平滑,然后再进行降采样(将图像尺寸行和列方向缩减一半);
- src:表示输入图像
- dst:表示输出图像
- dstsize:表示输出图像的大小
- borderType:表示图像边界的处理方式
降采样的意思其实是把图像的尺寸缩减一半,行和列同时缩减一半。
实际处理过程是隔行隔列删去图像中的对应行和列!由此我们也可以看出,这样缩减会带来的影响就是:原图中那些精细的细节边缘等地方,会因此变得锯齿状,产生失真,因此为了缩小之后图像看起来自然,必须进行平滑,这也就是这个算法为什么在降采样之前先对图像进行了高斯模糊的原因。
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace cv;
using namespace std;
int main()
{
Mat img1, img2;
namedWindow("example1", WINDOW_AUTOSIZE);
namedWindow("example2", WINDOW_AUTOSIZE);
img1 = imread("C:/Users/32498/Pictures/16.png");
imshow("example1", img1);
pyrDown(img1, img2);
imshow("example2", img2);
cout << "img1 size: " << img1.size << endl;
cout << "img2 size:" << img2.size << endl;
waitKey();
return 0;
}
pyrUp()
从一个低分辨率小尺寸的图像向下构建一个金子塔(尺寸变大,但分辨率不会)
pyrUp(src, dst=None, dstsize=None, borderType=None)
这个函数运行的过程就是先将图像的尺寸行和列方向都放大一倍,然后进行高斯平滑。
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace cv;
using namespace std;
int main()
{
Mat img1, img2;
namedWindow("example1", WINDOW_AUTOSIZE);
namedWindow("example2", WINDOW_AUTOSIZE);
img1 = imread("C:/Users/32498/Pictures/16.png");
imshow("example1", img1);
pyrUp(img1, img2);
imshow("example2", img2);
cout << "img1 size: " << img1.size << endl;
cout << "img2 size:" << img2.size << endl;
waitKey();
return 0;
}