图像金字塔是图像一种多尺度的表达,一幅图像的金字塔是一系列图像以金字塔的形状排列,并且分辨率逐级降低,这些低分辨率的图像都是经过图像向下采样得到的。图像所在的层越高,则图像分辨率越低。如下图,level 4的分辨率最低,并且Level 1.....Level4都是Level0经过逐级下采样得到的图像。
pyrUp(Mat src, Mat dst, Size(src.cols*2, src.rows*2))
对图像进行下采样,是主要的金字塔。
图像向下采样的函数:pyrDown函数 (尺寸减半)
图像向上采样的函数:pyrUp函数 (尺寸加倍)
注意: pyrDown和pyrUp不是逆操作。
pyrUp函数先扩充为原始图像的2倍,然后新增的行(偶数行)填充0,然后给指定的滤波器进行卷积去估计“丢失”像素的近似值。
pyrDown函数先对原始图像进行高斯内核卷积操作,然后将所有的偶数行和列去掉,会丢失一些信息。
把同一张图像在不同参数下做高斯模糊后的结果相减,得到的输出图像,成为高斯不同(DOG)
高斯不同时图像的内在特征,在灰度图像增强、角点检测中经常用到
上采样: 新图像的长宽各为为原始图像长宽的2倍。
pyrUp(Mat src, Mat dst, Size(src.cols*2, src.rows*2))
下采样:新图像的长宽各位原始图像长宽的1/2
pyrDown(Mat src, Mat dst, Size(src.cols/2, src.rows/2))
两张 图像相减:
subtract(InputArray src1, InputArray src2, OutputArray dst,InputArray mask=noArray(), int dtype=-1);
归一化显示:
normalize(InputArray src,OutputArray dst, double alpha=1, doublebeta=0, int norm_type=NORM_L2, int dtype=-1, InputArray mask=noArray() )
#include
#include
#include
using namespace std;
using namespace cv;
int main(int argc, char** argv)
{
// read image
Mat src, dst;
src = imread("C:/Users/qxq/Pictures/image/fox.jpg");
if (src.empty())
{
printf("Could not load image...");
return -1;
}
char INPUT_WIN[] = "input image";
char OUTPUT_WIN[] = "output image";
namedWindow(INPUT_WIN, CV_WINDOW_AUTOSIZE);
namedWindow(OUTPUT_WIN, CV_WINDOW_AUTOSIZE);
imshow(INPUT_WIN, src);
//图像金字塔,应用:图像融合、重建、特征提取等。
//上采样
pyrUp(src, dst, Size(src.cols * 2, src.rows * 2));
//imshow(INPUT_WIN, dst);
//降采样
Mat S_down;
pyrDown(src, S_down, Size(src.cols / 2, src.rows / 2));
//imshow(OUTPUT_WIN, S_down);
//高斯不同
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, 0);
subtract(g1,g2, dogImg, Mat()); //正常情况下,是低的减去高的,g1-g2。
//将最小最大值放大到0~255,便于观察。
normalize(dogImg, dogImg, 255, 0, NORM_MINMAX);
imshow("Dog image", dogImg);
waitKey(0);
return 0;
}
7、附件(当原图过大,可展示下采样后的图像)
//阈值分割
#include
#include
#include
#include
using namespace std;
using namespace cv;
Mat src;
int main(int argc, char**argv)
{
const char* path = "C:/Users/qxq/Pictures/Saved Pictures/2.jpg";
src = cv::imread(path);
if (src.empty())
{
cout << "Load image failed! " << endl;
return -1;
}
//上采样
Mat upimg,downimg;
pyrUp(src, upimg, Size(src.cols * 2, src.rows * 2));
//下采样
pyrDown(src, downimg, Size(src.cols / 2, src.rows / 2));
/*cv::imwrite("C:/Users/qxq/Pictures/Saved Pictures/2_up.jpg", upimg);
cv::imwrite("C:/Users/qxq/Pictures/Saved Pictures/2_down.jpg", downimg);*/
/*cv::imshow("src", src);
cv::imshow("up_img", upimg);*/
cv::imshow("down_img", downimg);
//高斯不同
Mat gray_src, g1, g2, dogImg;
cvtColor(downimg, gray_src, CV_BGR2GRAY);//转化为灰度图
GaussianBlur(gray_src, g1, Size(3, 3), 0, 0);//对灰度图做高斯滤波
GaussianBlur(g1, g2, Size(3, 3), 0, 0);//再第一次滤波的基础上再做一次滤波
subtract(g1, g2, dogImg, Mat()); //正常情况下,是低的减去高的,g1-g2。
normalize(dogImg, dogImg, 255, 0, NORM_MINMAX);//将最小最大值放大到0~255,便于观察。
imshow("Dog image", dogImg);
waitKey(0);
return 0;
}