转载请标明出处:数字图像处理:图像金字塔_数字图像处理opencv_新浪博客
(一)概念
以多个分辨率来表示图像的一种有效且概念简单的结构是图像金字塔。图像金字塔最初用于机器视觉和图像压缩,一个图像金字塔是一系列以金字塔形状排列的,分辨率逐步降低的图像集合。金字塔的底部是待处理图像的高分辨率表示,而顶部是低分辨率的近似。我们将一层一层的图像比喻成金字塔,层级越高,则图像越小,分辨率越低。
如图所示:
(二)分类
高斯金字塔(Gussianpyramid):用来下采样,主要的图像金字塔。
拉普拉斯金字塔(Laplacianpyramid):用来从金字塔底层图像搭建上层未采样图像,上采样重建一个图像。在数字图像处理中也即是预测残差,可以对图像进行最大程度的还原,配合高斯金字塔一起使用。
图像金字塔中的向上和向下采样分别通过OpenCv函数pyrUp和pyrDown实现。
这里的向下与向上采样,是对图像的尺寸而言的(和金字塔的方向相反),即向下就是图像尺寸缩小,向上是图像尺寸变大。
2.1高斯金字塔(缩小图像)
为了获取层级i+1层的高斯金字塔图像,采取如下方法:
(1)对图像i进行高斯内核卷积;
(2)将所有偶数行和列去除;
得到的图像即为i+1层的图像,显而易见,结果图像只有原始图像的四分之一。通过对图像i层的不停迭代以上步骤就可以得到整个金字塔。同时可以发现,向下取样会逐渐丢失图像的信息。
2.2拉普拉斯金字塔(放大图像)
(1)将图像在每个方向扩大为原来的两倍,新增的行和列以0填充;
(2)使用先前同样的内核(乘以四)与放大后的图像卷积,获得“新增像素”的值
得到的图像即为放大后的图像,但是与原来图像相比发现会比较模糊,因为在缩放的过程中已经丢失了一些信息,如果想在缩小和放大整个过程中减少信息的丢失,这些数据形成了拉普拉斯金字塔。
也就是说,拉普拉斯金字塔是通过源图像减去先缩小后放大的图像的一些图像构成的。
下图展示高斯金字塔和拉普拉斯金子塔之间的关系:
(三)代码实现
- C++: void pyrUp(InputArray src, OutputArraydst, const Size& dstsize=Size(), int borderType=BORDER_DEFAULT ) //向上采样
- C++: void pyrDown(InputArray src,OutputArray dst, const Size& dstsize=Size(), int borderType=BORDER_DEFAULT) //向下采样
例:
NormalText Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
#include #include #include #include using namespace cv; using namespace std; int main() { //读入图片,注意图片路径 Mat srcimage=imread("F:\\Matlab\\pictures\\Three.jpg"); cvtColor(srcimage,srcimage,CV_BGR2GRAY); Mat dstimage; //图片读入成功与否判定 if(!srcimage.data) { cout<<"you idiot!where did you hide lena!"<<endl; //等待按键 system("pause"); return -1; } imshow("srcImage",srcimage); pyrDown(srcimage,dstimage,Size(srcimage.cols/2,srcimage.rows/2)); imshow("afterResize",dstimage); //等待按键 waitKey(); return 0; } |