opencv图像金字塔的介绍

1.学习目标:

  • 掌握opencv图像金字塔的原理

学习内容:

1.什么是图像金字塔?

2.图像金字塔有什么用?

3.图像金字塔实现方式


学习产出:

1. 什么是图像金字塔?
图像金字塔(如图 1 所示)是一种以多分辨率来解释图像的结构,通过对原始图像进行多尺度
像素采样的方式,生成 N 个不同分辨率的图像。把具有最高级别分辨率的图像放在底部,以金字
塔形状排列,往上是一系列像素(尺寸)逐渐降低的图像,一直到金字塔的顶部只包含一个像素点
的图像,这就构成了传统意义上的图像金字塔。图像金字塔底部是待处理的高分辨率图像,也就是
原始图像,顶部是低分辨率的近似图像。一般情况下,都是每向上移动一级,图像的宽和高都降低
为原来的 1/2 。金字塔高层图片通过向上采样得到底层图片,底层图片通过向下取样得到高层图
片。

opencv图像金字塔的介绍_第1张图片

1 图像金字塔
2. 图像金字塔有什么用?
(1) 图像金字塔能够帮助提取更多“有用”的特征,在进行图像处理时能够帮助节省计算资源。特
别地,在目标检测的场景中,由于不同摄像头分辨率、设置位置不同,场景光线敏感程度都有
差别,图像中的物体通常很可能是远近不一,大小不一,由于图像金字塔底层关注图像细节,
而高层注重图像轮廓,此时就可以利用金字塔来检测不同尺度下的物体。这种方法要比使用不
同大小的 sliding window 在原图上做检测节省太多的算力,大大实验增强效果,避免了大量
噪声图片的输入造成计算资源的浪费。
(2) 图像金字塔有助于避免模型过拟合。在某些图像处理的算法中,图像金字塔的多分辨率运算可
以避免陷入局部点或者过拟合状态,增强模型鲁棒性。
(3) 图像金字塔可用于图像融合。图像拉普拉斯金字塔将源图像分别分解到不同的空间频带上,而
图像融合过程就是在各空间频率层上分别进行的,这样就可以针对不同分解层的不同频带上的
特征与细节,采用不同的融合算子以达到突出特定频带上特征与细节的目的。即有可能将来自
不同图像的特征与细节融合在一起。
(4) 图像缩放等等。
3. 图像金字塔实现方式 1——resize 函数
resize 函数主要实现的功能是将图片缩放到目标大小。resize 函数的主要特点是,它不会使图
像变得模糊。函数的构成:
resize(InputArray src,
OutputArray dst,
Size dsize,
double fx = 0,
double fy = 0,
int interpolation = INTER_LINEAR) 其中 src 代表原图像,dst 代表输出图像,const Size & dstsize 设置输出图像的大小,fx,fy
设定 x 和 y 方向上的缩放比例,interpolation 指定了默认插值方式为双线性插值,双线性插值的
数学原理如下。

opencv图像金字塔的介绍_第2张图片

例:resize(img, dst, Size(),0.5,0.5);将原图 img 长宽都变为原来的 0.5 倍,得到输出图像 dst
的分辨率变为原来的 1/4,重复以上操作我们就可以得到通过下采样得到的多层金字塔图片。
4. 图像金字塔实现方式 2——高斯金字塔(Gaussianpyramid)
高斯金字塔是指通过高斯模糊滤波和下采样不断地将图像的尺寸缩小,进而在金字塔中包含多
个分辨率的一组图像。高斯金字塔的形式如下图所示:

opencv图像金字塔的介绍_第3张图片

 opencv图像金字塔的介绍_第4张图片

一般情况下,高斯金字塔的最底层为原图像,每向上一层就会通过高斯模糊滤波+下采样缩小
一次图像的尺寸。通常情况下,图像的长与宽会缩小为原来的一半,由于每次图像的长与宽都缩小
为原来的一半,图像的缩小速度非常快,因此常见的高斯金字塔的层数为 3~6。以图为例,对应分
辨率 512*512 的原图 O 首先做高斯变换得到相同尺寸的滤波图像,然后将滤波图像进行下采样就 得到了第一次采样图片 D1,此时图片的分辨率变为 256*256,重复以上的操作就能得到多次采样
后的高斯金字塔。 设 Gn 表示第 n 层高斯金字塔的图像,则 G0 表示高斯金字塔的最底层(即原图像)。为了得 到 G n+1,首先需要对 Gn 进行高斯核卷积,即做高斯低通滤波,然后删除所有的偶数行和偶数列, 从而得到 Gn+1。这个函数使用的高斯核如下:

opencv图像金字塔的介绍_第5张图片

高斯滤波其实是一种线性平滑滤波,适用于消除高斯噪声,广泛应用于图像处理的减噪过程。
简单来说就是整个图像某个像素点的值与周围像素点的值挂钩,原图像某一像素点的值其实是其本
身和周围像素点值的加权平均过程。之所以要先进行高斯滤波,是为了在下采样删除偶数行和列的
时候能尽量减少信息的丢失。 高斯金字塔实现的函数:pyrDown,函数构成:
pyrDown(InputArray src,
OutputArray dst,
const Size & dstsize = Size(),
int borderType =BORDER_DEFAULT)
参数解析:
InputArray src:源图像,Mat 类的对象
OutputArray dst:输出图像
const Size & dstsize:输出图像的大小
borderType:边界处理方式,处理的方法参照官网的说明为:“gfedcb | abcdefgh| gfedcba”。之所以会有边界处理方式,是因为在进行高斯滤波图像做卷积时,处于边界的像 素点在被选定为中心点时不能直接卷积,需要在原图边界添加像素点作为补充。 另一方面,我们可以通过上采样的方法实现高斯金字塔,上采样的过程包括:(1)将图像 在每个方向放大为原来的两倍,新增的行和列用 0 填充;(2)使用向下采样时所使用的的高 斯滤波器对补零后的图像进行滤波处理,以获取向上采样的结果图像;(3)如上步骤,下采 样后图片扩大为原图的 4 倍,重复上诉步骤得到高斯金字塔。实现函数为:pyrUp 函数,函数 构成为:pyrUp( InputArray src, OutputArray dst,const Size& dstsize = Size(), int borderType = BORDER_DEFAULT ),参数的释义参照 pyrDown 函数。但值得注意的是在 进行步骤(2)时所用的高斯核为下采样金字塔所用高斯核的 1/4,因为 RGB 图像像素值的范 围是[0, 255],由于其中添 0 后图像中四分之三的像素点的值都是为零,如果直接使用高斯滤 波器对其进行卷积计算,会导致像素值的范围变为[0, 255*1/4]。所以,要将所使用的高斯滤 波器系数乘以 4,以保证得到像素值的范围仍旧在[0, 255]内。
5. 图像金字塔实现方式 3——拉普拉斯金字塔(Laplacianpyramid)
拉普拉斯金字塔: 用来从金字塔低层图像重建上层未采样图像,在数字图像处理中也即是预测
残差,可以对图像进行最大程度的还原,配合高斯金字塔一起使用。首先对高斯金字塔原始图像
Gi 进行向下取样,然后向上采用,最后与原始图像相减,就得到了拉普拉斯金字塔图像。
要从高斯金字塔第 i 层生成第 i+1 层(即 G_i+1),首先要用高斯核对 G_1 进行卷积,然后删除
所有偶数行和偶数列,新得到图像面积会变为源图像的四分之一。按上述过程对输入图像 G_0 执
行操作就可产生出整个高斯金字塔。图像金字塔中的向上和向下采样分别通过 OpenCV 函数 pyrUp 和 pyrDown 实现。因为用 pyrDown 做下采样操作的时候会有像素信息损失,做高斯模
糊时会滤掉高频像素点。拉普拉斯图像可以帮助提取出图像的高分辨率的像素点和下采样丢掉的点。
假设我们已经有一个高斯图像金字塔,对于其中的第 i 层图像(高斯金字塔最下面为第 0 层),
首先通过下采样得到一尺寸缩小一半的图像,即高斯金字塔中的第 i+1 层或者不在高斯金字塔中,
之后对这张图像再进行上采样,将图像尺寸恢复到第 i 层图像的大小,最后求取高斯金字塔第 i 层
图像与经过上采样后得到的图像的差值图像,这个差值图像就是拉普拉斯金字塔的第 i 层图像,整
个过程的流程如图所示。计算公式 :Li = Gi -PyrUp( PyrDown(Gi) )。
opencv图像金字塔的介绍_第6张图片

 

上图中第一列图片为高斯下采样得到的高斯金字塔图片;第二列图片为高斯金字塔第 Gi 层图
片与高斯金字塔第 Gi+1 层图片上采样之后两者作差得到的拉普拉斯金字塔 Li;第三列图片为通过
拉普拉斯金字塔恢复出来的图片。
参考文章:
OpenCV官方文档_w3cschool
opencv学习笔记(十一):图像金字塔 - 知乎

你可能感兴趣的:(图像金字塔,opencv,c++,图像处理)