OpenCV学习12——图像的上采样和降采样
-
图像金字塔概念:
图像金字塔是图像多尺度表达的一种,是一种以多分辨率来解释图像的有效但概念简单的结构。一幅图像的金字塔是一系列以金字塔形状排列的分辨率逐步降低,且来源于同一张原始图的图像集合。其通过梯次向下采样获得,直到达到某个终止条件才停止采样。我们将一层一层的图像比喻成金字塔,层级越高,则图像越小,分辨率越低。
图像的金字塔变换我们可以理解为是一种图像的大小变换,是在保证图像的特征不变的情况下来进行图像大小的变换,图像处理中图像大小的变换中最常见的就是放大(zoom in)和缩小(zoom out),则对于图像金字塔来说从上向下变换就是放大,增大分辨率,从下向上变换就是缩小,减小分辨率。高斯金字塔:用来对图像进行降采样。高斯金字塔本质上为信号的多尺度表示法,亦即将同一信号或图片多次的进行高斯模糊,并且向下取样,藉以产生不同尺度下的多组信号或图片以进行后续的处理,例如在影像辨识上,可以借由比对不同尺度下的图片,以防止要寻找的内容可能在图片上有不同的大小。高斯金字塔的理论基础为尺度空间理论,而后续也衍生出了多分辨率分析。
高斯金字塔的相关知识与概念我们可以总结为:高斯金字塔是从底向上,逐层降采样得到;降采样后的图像是原图像(像素大小为X×Y)的X/2×Y/2,也就是对原图像删除偶数行与列(即得到降采样之后上一层的图片)
高斯金字塔的生成过程分为两部:
①对当前层进行高斯模糊
②对模糊后的图像删除当前层的偶数行与列,即可得到上一层的图像,这样子上一层与下一层图像相比都只有他的1/4大小
高斯不同(Difference of Gaussian-DOG):
定义:高斯不同就是把同一张图像在不同的参数下做高斯模糊之后的结果相减,得到的输出图像就成为高斯不同(DOG)
高斯不同是图像的内在特征,在灰度图像增强、角点检测中经常用到。拉普拉斯金字塔:用来重建一张图片根据他的上层降采样图片。
-
采样用到的相关函数:
上采样:CV_EXPORTS_W void pyrUp( InputArray src, OutputArray dst, const Size& dstsize = Size() );
pyrUp(src,dst,Size(src.cols×2,src.rows×2))
生成的图像是原图在宽与高各放大两倍下采样:
CV_EXPORTS_W void pyrDown( InputArray src, OutputArray dst, const Size& dstsize = Size() );
pyrDown(src,dst,Size(src.cols/2,src.rows/2))
生成的图像是原图在宽与高各缩小一倍 -
实验代码及内容展示:
#include <opencv2/opencv.hpp> #include <iostream> using namespace std; using namespace cv; int main() { Mat src, src_up, src_down, src_dog; src = imread("C:/Users/he104/Desktop/timg.jpg"); if (src.empty()) { cout << "could not load the image" << endl; return -1; } imshow("orign_image", src); //UP pyrUp(src, src_up, Size(src.cols * 2, src.rows * 2)); imshow("UP", src_up); //DOWN pyrDown(src, src_down, Size(src.cols / 2, src.rows / 2)); imshow("DOWN", src_down); //DOG Mat src_gray, g1, g2, dst; cvtColor(src, src_gray, CV_BGR2GRAY); GaussianBlur(src_gray, g1, Size(7, 7), 0, 0); GaussianBlur(g1, g2, Size(7, 7), 0, 0); subtract(g1, g2, dst, Mat()); normalize(dst, dst, 255, 0, NORM_MINMAX); imshow("DOG", dst); waitKey(0); destroyAllWindows(); return 0; }