花老湿OpenCV学习:图像金字塔
图像金字塔:
图像金字塔是图像中多尺度表达的一种,最主要用于图像的分割,是一种以多分辨率来解释图像的有效但概念简单的结构。
金字塔的底部是待处理图像的高分辨率表示,而顶部是低分辨率的近似。
我们将一层一层的图像比喻成金字塔,层级越高,则图像越小,分辨率越低。
一般情况下有两种类型的图像金字塔常常出现在文献和以及实际运用中。他们分别是:
高斯金字塔(Gaussianpyramid): 用来向下采样,主要的图像金字塔 拉普拉斯金字塔(Laplacianpyramid): 用来从金字塔顶部(高层级、分辨率低)的图像重建下部(低层级,分辨率大)未采样图像,在数字图像处理中也即是预测残差,可以对图像进行最大程度的还原,配合高斯金字塔一起使用。
高斯金字塔:
对图像向上采样:pyrUp函数
对图像向下采样:pyrDown函数
对图像的向下取样:
为了获取层级为 G_i+1 的金字塔图像,我们采用如下方法:
<1>对图像G_i进行高斯内核卷积
<2>将所有偶数行和列去除
得到的图像即为G_i+1的图像,显而易见,结果图像只有原图的四分之一。通过对输入图像G_i(原始图像)不停迭代以上步骤就会得到整个金字塔。同时我们也可以看到,向下取样会逐渐丢失图像的信息。
对图像的向上取样:
如果想放大图像,则需要通过向上取样操作得到,具体做法如下:
<1>将图像在每个方向扩大为原来的两倍,新增的行和列以0填充
<2>使用先前同样的内核(乘以4)与放大后的图像卷积,获得 “新增像素”的近似值
得到的图像即为放大后的图像,但是与原来的图像相比会发觉比较模糊,因为在缩放的过程中已经丢失了一些信息,如果想在缩小和放大整个过程中减少信息的丢失,这些数据形成了拉普拉斯金字塔。
拉普拉斯金字塔:
下式是拉普拉斯金字塔第i层的数学定义:
因此,我们可以直接用OpenCV进行拉普拉斯运算:
也就是说,拉普拉斯金字塔是通过源图像减去先缩小后再放大的图像的一系列图像构成的。
代码演示:
#include "pch.h" #include <iostream> #include "opencv2/opencv.hpp" using namespace std; using namespace cv; int main() { //高斯金字塔 Mat g1,g2, g3; //拉普拉斯金字塔 Mat l2; g1 = imread("F:\visual studio\Image\women1.jpg"); if (g1.empty()) { cout << "Cant load the image" << endl; return -1; } imshow("g1", g1); //降采样 pyrDown(g1, g2, Size(g1.cols /2, g1.rows / 2)); imshow("g2", g2); pyrDown(g2, g3, Size(g2.cols / 2, g2.rows / 2)); imshow("g3", g3); //上采样 Mat up2g2; pyrUp(g3, up2g2, Size(g3.cols * 2, g3.rows * 2)); imshow("up2g2", up2g2); //拉普拉斯金字塔 l2 = g2 - up2g2; imshow("l2", l2); Mat add2g2; add(up2g2, l2, add2g2); imshow("add2g2", add2g2); waitKey(0); }
效果如下:
高斯金字塔:
利用拉普拉斯金字塔重构上采样图像: