14-图像金子塔-上采样与降采样
掌握
1、图像金字塔概念;
2、采样API;
3、代码演示;
图像金字塔概念
1、如下图,图像金子塔从上到下,分辨率依次提高,图像采样越多,分辨率越高;
2、上采样:分辨率提高的采样,得到的图像宽高是原来图像的2倍;图像金子塔中对应图像从上到下;图像放大(zoom in),图像大小改变(变大);
3、降采样:分辨率降低的采样,得到的图像宽高是原来图像的1/2,图像金字塔中对应图像从下到上;图像缩小(zoom out)
4、通过图像金字塔上采样,降采样产生一系列不同分辨率的图片,然后在不同的尺寸空间寻找图像对应的特征,图像金字塔可以保证图像的特征一致存在;
5、一个图像金子塔由一系列的图像组成,最下方图像最大,顶层图像最小;图像金子塔在图像融合,重建,特征提取上都有重要意义;
图像金字塔分类
1、高斯金子塔–用来对图像进行降采样;
- 高斯金字塔从底向上,逐层降采样得到(不能越级);
- 降采样后图像宽高变为原来1/2,图像大小变为原来1/4,删除其中的偶数行与偶数列;
- 高斯金子塔生成步骤:
1、高斯模糊:GaussianBlur();
2、删除当前的偶数行与列;
2、高斯不同(Difference of Gaussian-DOG)
①定义: 把同一张图像在不同的参数下做高斯模糊之后的结果相减,得到的输出图像,称为高斯不同(DOG);
②高斯不同是图像的内在特征,在灰度图像增强,角点检测中经常用到;
3、拉普拉斯金字塔-用来重建一张图片根据它的上层降采样图片;
相关API
1、上采样:cv::pyrUp
--zoom in 放大;
2、降采样:cv::pyrDown
–zoom out 缩小;
//生成图像宽高各放大2倍
pyrUp(Mat src , Mat dest , Size(src.cols * 2 , src.rows * 2));
//生成图像宽高各缩小1/2
pyrDown(Mat src, Mat dest , Size(src.cols/2 , src.rows/2));
归一化函数:normalize():
Code
思路:通过对图像上采样和降采样,得到一系列的图片组成高斯金字塔,相邻图片做减法得到高斯不同,归一化显示高斯不同的图片(高斯不同得到的图像像素值很低,图像很暗);
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main(int argc, char** argv)
{
Mat src = imread("C:\\Users\\hello\\Desktop\\2.jpg");
Mat dst;
if (src.empty())
{
cout << "could not load the image...\n";
return -1;
}
namedWindow("input image", CV_WINDOW_AUTOSIZE);
imshow("input image", src);
char OUTPUT_WIN[] = "sample up";
namedWindow(OUTPUT_WIN, CV_WINDOW_AUTOSIZE);
//上采样;
pyrUp(src, dst, Size(src.cols * 2, src.rows * 2));
imshow(OUTPUT_WIN, dst);
//降采样
Mat s_down;
pyrDown(src, s_down, Size(src.cols / 2, src.rows / 2));
imshow("sample down", s_down);
//高斯不同 得到高斯金子塔后,对每层图像进行高斯模糊,做差得到高斯不同
Mat graysrc,g1, g2,dogImg;
cvtColor(src, graysrc, CV_BGR2GRAY);
GaussianBlur(graysrc, g1, Size(5, 5), 0, 0);//sigma根据算法自动生成
GaussianBlur(g1, g2, Size(5, 5), 0, 0); //叠代高斯模糊
//两次高斯模糊做差得到高斯不同
subtract(g1, g2, dogImg,Mat()); //图像做减法得到高斯不同(分叉图像)
//归一化显示
normalize(dogImg, dogImg, 255, 0,NORM_MINMAX); //将图像从0-1之间变换到0-255之间 adaptivethreshold();
imshow("DOG Image", dogImg); //高斯不同得到的值很低,图像很暗
waitKey(0);
return 0;
}
效果
灰度图像: