版权声明:本文由 Micheal 超 博客 创作,转载请附带链接,有问题欢迎交流。 https://blog.csdn.net/qq_42887760/article/details/86190793
图像金字塔概念
- 我们在图像处理中常常会调整图像大小,最常见的就是放大(zoom in)和缩小(zoom out),尽管几何变换也可以实现图像放大和缩小,但是这里我们介绍图像金字塔
- 一个图像金字塔式一系列的图像组成,最底下一张是图像尺寸最大,最上方的图像尺寸最小,从空间上从上向下看就想一个古代的金字塔。
- 高斯金子塔 – 用来对图像进行降采样
- 拉普拉斯金字塔 – 用来重建一张图片根据它的上层降采样图片(分辨率较低)
图像金字塔概念 – 高斯金字塔
- 高斯金子塔是从底向上,逐层降采样得到。
- 降采样之后图像大小是原图像MxN的M/2 x N/2 ,就是对原图像删除偶数行与列,即得到降采样之后上一层的图片。
- 高斯金子塔的生成过程分为两步:
- 1.对当前层进行高斯模糊
- 2.删除当前层的偶数行与列
即可得到上一层的图像,这样上一层跟下一层相比,都只有它的1/4大小。
高斯不同(Difference of Gaussian-DOG)
- 定义:就是把同一张图像在不同的参数下做高斯模糊之后的结果相减,得到的输出图像。称为高斯不同(DOG)
- 高斯不同是图像的内在特征,在灰度图像增强、角点检测中经常用到。
采样相关API
-
上采样(cv::pyrUp) – zoom in 放大
pyrUp(Mat src, Mat dst, Size(src.cols2, src.rows2))
生成的图像是原图在宽与高各放大两倍 -
降采样 (cv::pyrDown) – zoom out 缩小
pyrDown(Mat src, Mat dst, Size(src.cols/2, src.rows/2))
生成的图像是原图在宽与高各缩小1/2
代码案例:
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace cv;
int main(){
//1. 加载图像和显示原图
Mat src=imread("E:/Experiment/OpenCV/Pictures/dog2.jpg");
if(src.empty()){
printf("could not load image...");
return -1;
}
namedWindow("input_windows",CV_WINDOW_AUTOSIZE);
imshow("input_windows",src);//显示图片
//2. 创建两个Mat对象来存储操作的结果,并执行采样操作
Mat dst1,dst2;
//2.1. 上采样
pyrUp(src, dst1, Size(src.cols * 2, src.rows * 2));//上采样,生成的图像是原图在宽与高各放大两倍
imshow("pyrUp", dst1);
//2.2. 下采样
pyrDown(src, dst2, Size(src.cols / 2, src.rows / 2));//降采样,生成的图像是原图在宽与高各缩小1/2
imshow("pyrDown", dst2);
//高斯不同
Mat gray_src,gblur1,gblur2,gblur3,dogImg,dogImg2,dogImg3;
cvtColor(src, gray_src, COLOR_BGR2GRAY);
GaussianBlur(gray_src, gblur1, Size(3, 3), 0, 0);
GaussianBlur(gblur1, gblur2, Size(3, 3), 0, 0);//方式一
subtract(gblur1, gblur2, dogImg, Mat());//获取 DOG ,应该要低的gblur1减高的gblur2
//将灰度图的0-255空间,转换到0-1空间(二值空间),让原本淡淡的图像变得清楚了
normalize(dogImg, dogImg, 255, 0, NORM_MINMAX);//参数:255最大值,0最小值,NORM_MINMAX 最大最小化
imshow("dogImg", dogImg);//能看到淡淡的猫的眼睛的轮廓
GaussianBlur(gray_src, gblur3, Size(5, 5), 0, 0);
subtract(gblur1, gblur3, dogImg2, Mat());//方式二
normalize(dogImg2, dogImg2, 255, 0, NORM_MINMAX);
imshow("dogImg2", dogImg2);//也能看到淡淡的猫的眼睛的轮廓
subtract(gblur2, gblur1, dogImg3, Mat());//高减低的
normalize(dogImg3, dogImg3, 255, 0, NORM_MINMAX);
imshow("dogImg3", dogImg3);
waitKey(0);
return 0;
}
运行截图:
小案例:
1. 加载图片
2. 进行上采样(按’u’后):
3. 执行下采样(按’d’后):
4. 退出程序(按’Esc’后):
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace cv;
int main(){
//1. 加载图像和显示原图
Mat src=imread("E:/Experiment/OpenCV/Pictures/dog2.jpg");
if(src.empty()){
printf("could not load image...");
return -1;
}
namedWindow("input_windows",CV_WINDOW_AUTOSIZE);
imshow("input_windows",src);//显示图片
Mat temp,dst;
temp=src;
dst=temp;
while(true){
int c;
c = waitKey(10);
if( (char)c == 27 ){//Esc键
break;
}
else if( (char)c == 'u' ){
pyrUp( temp, dst, Size( temp.cols*2, temp.rows*2 ) );
printf( "** Zoom In: Image x 2 \n" );
}
else if( (char)c == 'd' )
{
pyrDown( temp, dst, Size( temp.cols/2, temp.rows/2 ) );
printf( "** Zoom Out: Image / 2 \n" );
}
imshow( "output_windows", dst );
temp = dst;
}
waitKey(0);
return 0;
}