本文讲述基于图像上采样和降采样的图像金字塔和api使用
图像金字塔是 图像多尺度表达的一种,是一种以多分辨率来解释图像的有效但概念简单的结构。一幅图像的金字塔是一系列以金字塔形状排列的分辨率逐步降低,且来源于同一张原始图的图像集合。其通过梯次向下采样获得,直到达到某个终止条件才停止采样。我们将一层一层的图像比喻成金字塔,层级越高,则图像越小,分辨率越低。
高斯金字塔是在图像处理、计算机视觉、信号处理上所使用的一项技术。高斯金字塔本质上为信号的多尺度表示法,亦即将同一信号或图片多次的进行高斯模糊,并且向下取样,藉以产生不同尺度下的多组信号或图片以进行后续的处理,例如在影像辨识上,可以借由比对不同尺度下的图片,以防止要寻找的内容可能在图片上有不同的大小。高斯金字塔的理论基础为尺度空间理论,而后续也衍生出了多分辨率分析。
拉普拉斯金字塔的构造用到高斯金字塔。拉普拉斯金字塔第i层的数学定义如下
每一层的定义意思是拉普拉斯金字塔每一层的图像为同一层高斯金字塔的图像减去上一层的图像进行上采样并高斯模糊的结果。
拉普拉斯金字塔是通过原图像减去一系列通过采样操作构成的
简而言之:会模糊图像并对其进行下采样
void pyrDown( InputArray src, OutputArray dst,const Size& dstsize = Size(),
int borderType = BORDER_DEFAULT );
/*@param src输入图像。
@param dst output image;它具有指定的大小和与src相同的类型。
@param dstsize输出图像的大小。
@param borderType像素外推方法*/
简而言之:向上采样图像,然后使其模糊
void pyrUp( InputArray src, OutputArray dst, const Size& dstsize = Size(),
int borderType = BORDER_DEFAULT );
/*
@param src输入图像。
@param dst输出图像。它具有指定的大小和与src相同的类型。
@param dstsize输出图像的大小。
@param borderType像素外推方法
*/
简而言之:计算两个数组或数组与标量之间的每元素差
void add(InputArray src1, InputArray src2, OutputArray dst,
InputArray mask = noArray(), int dtype = -1);
/*
@param src1第一个输入数组或标量。
@param src2第二个输入数组或标量。
@param dst输出数组的大小和通道数与输入数组相同。
@param mask可选操作掩码;这是一个指定元素的8位单通道数组要更改的输出数组的。
@param dtype输出数组的可选深度
*/
简而言之:规范化数组的范数或值范围
void normalize( InputArray src, InputOutputArray dst, double alpha = 1, double beta = 0,
int norm_type = NORM_L2, int dtype = -1, InputArray mask = noArray());
/*
@param src输入数组。
@与src大小相同的param dst输出数组。
@param alpha norm值,用于标准化到或范围较低的边界正常化。
@在范围标准化的情况下,param beta上限范围边界;它不用于范数正常化。
@param norm类型规范化类型(请参阅cv::NormTypes)。
@param dtype如果为负数,则输出数组的类型与src相同;否则,输出数组的类型与src相同
*/
高斯差分函数,即高斯差(英语:Difference of Gaussians,简称“DOG”)是一种将一个原始灰度图像的模糊图像从另一幅灰度图像进行增强的算法,通过DOG以降低模糊图像的模糊度。这个模糊图像是通过将原始灰度图像经过带有不同标准差的高斯核进行卷积得到的。用高斯核进行高斯模糊只能压制高频信息。从一幅图像中减去另一幅可以保持在两幅图像中所保持的频带中含有的空间信息。这样的话,DOG就相当于一个能够去除除了那些在原始图像中被保留下来的频率之外的所有其他频率信息的带通滤波器。
DOG是一个空总额的小波母函数,它从一个窄高斯减去一个宽高斯,是墨西哥帽小波的一个近似。一维情况下它的定义公式如下:
把同一张图像在不同的参数下做高斯模糊之后的结果相减,得到的输出图像,成为高斯不同(DOG)。高斯不同是图像的内在特征,在灰度图像增强、角点检测中经常用到。
程序实现:
#include
#include
int main() {
cv::Mat src, dst;
src = cv::imread("D:\\Myfile\\素材照片\\opencv素材照片\\4.jpg", cv::IMREAD_GRAYSCALE);
if (src.empty()) {
std::cout << "your image could not load!";
return -1;
}
char init_name[] = "initial_iamge";
cv::namedWindow(init_name, cv::WINDOW_AUTOSIZE);
cv::imshow(init_name, src);
//高斯金字塔
cv::pyrUp(src, dst, cv::Size(src.cols * 2, src.rows * 2));//上采样
//cv::pyrDown(src, dst, cv::Size(src.cols / 2, src.rows / 2));//降采样
cv::imshow("out", dst);
cv::waitKey(0);
return 0;
}
程序实现:
#include
#include
int main() {
cv::Mat src, dst;
src = cv::imread("D:\\Myfile\\素材照片\\opencv素材照片\\4.jpg", cv::IMREAD_GRAYSCALE);
if (src.empty()) {
std::cout << "your image could not load!";
return -1;
}
char init_name[] = "initial_iamge";
cv::namedWindow(init_name, cv::WINDOW_AUTOSIZE);
cv::imshow(init_name, src);
//高斯不同
cv::Mat image1, image2;
cv::GaussianBlur(src, image1, cv::Size(5, 5), 0, 0);
cv::GaussianBlur(image1, image2, cv::Size(5, 5), 0, 0);
cv::subtract(image1, image2, dst, cv::Mat());
//归一化显示
cv::normalize(dst, dst, 255, 0, cv::NORM_MINMAX);
cv::namedWindow("out", cv::WINDOW_AUTOSIZE);
cv::imshow("out", dst);
cv::waitKey(0);
return 0;
}
本文讲述了图像金字塔,通过上下采样来操作图像,以高斯金字塔和拉普拉斯金字塔为例,同时也讲了其他API接口,拉普拉斯金字塔可在参考来源的第二个拉普拉斯金字塔中学习,讲的很全面。
高斯差分函数链接
拉普拉斯金字塔链接
如有疑问,敬请留言!
如有错误,敬请指正!