文章目录
概念
图像金字塔:
图像金字塔是图像的集合,所有图像都来自单个原始图像,这些图像被连续下采样,直到达到某个所需的停止点。
有两种常见的图像金字塔:
高斯金字塔:用于对图像进行下采样
拉普拉斯金字塔:用于从金字塔较低的图像(分辨率较低)重建上采样图像
高斯金字塔:
把金字塔想象成一组图层,层越高,尺寸越小。
每一层都从下到上编号,所以层(i+1)(记作Gi+1)比层i (Gi)小。
为了在高斯金字塔中生成层(i+1),我们做如下操作:
1.将Gi与高斯核卷积:
2.删除每一个偶数的行和列。
生成的图像将恰好是前一个图像面积的四分之一。在输入图像G0(原始图像)上迭代这个过程产生整个金字塔。
上面的程序是对图像的下采样。如果我们想让它变大呢?:用0填满列
1。首先,使用新的偶数行和在每个维度上将图像放大到原来的两倍
1.与上面所示的相同内核进行卷积(乘以4),以逼近“缺失像素”的值
一、opencv 函数支持
下采样:
CV_EXPORTS_W void pyrDown( InputArray src, OutputArray dst,
const Size& dstsize = Size(), int borderType = BORDER_DEFAULT );
上采样:
CV_EXPORTS_W void pyrUp( InputArray src, OutputArray dst,
const Size& dstsize = Size(), int borderType = BORDER_DEFAULT );
代码示例:
cv::Mat src;
src = cv::imread("D:\\QtProject\\Opencv_Example\\pyramid\\pyramid.jpg", cv::IMREAD_COLOR);
if (src.empty()) {
cout << "Cannot load image" << endl;
return;
}
while(1)
{
show(src);
char c = (char)waitKey(0);
if( c == 27 )
{ break; }
else if( c == 'i' )
{
pyrUp( src, src, Size( src.cols*2, src.rows*2 ) );
}
else if( c == 'o' )
{
pyrDown( src, src, Size( src.cols/2, src.rows/2 ) );
}
}
运行效果:
原图:
两次上采样:
两次下采样: