高斯拉普拉斯——图像金字塔

图像金字塔原理

       一般情况下,我们要处理是一副具有固定分辨率的图像。但是有些情况下, 我们需要对同一图像的不同分辨率的子图像进行处理。比如,我们要在一幅图像中查找某个目标,比如脸,我们不知道目标在图像中的尺寸大小。这种情况 下,我们需要创建一组图像,这些图像是具有不同分辨率的原始图像。我 们把这组图像叫做图像金字塔(简单来说就是同一图像的不同分辨率的子图集 合)。如果我们把最大的图像放在底部,最小的放在顶部,看起来像一座金字 塔,故而得名图像金字塔。
 
      图像金字塔是一个图像集合,集合中所有的图像都源于同一个原始图像,而且是通过对原始图像连续降采样获得,直到达到某个中止条件才停止采样。
 
有两类图像金字塔:高斯金字塔和拉普拉斯金字塔
       

一、高斯金字塔

   
     高斯金字塔用来向下降采样图像,而拉普拉斯金字塔则用来从金字塔低层图像中向上采样重建一个图像。
 
      高斯金字塔的顶部是通过将底部图像中的连续的行和列去除得到的:要从金字塔第i层生成第i+1层(我们表示第i+1层为Gi+1),我们先要用高斯核对Gi进行卷积(顶部图像中的每个像素值等于下一层图像中 5 个像素的高斯加权平均值),然后删除所有偶数行和偶数列。 这样 操作一次一个 MxN 的图像就变成了一个 M/2xN/2 的图像。所以这幅图像 的面积就变为原来图像面积的四分之一。这被称为 Octave。连续进行这样 的操作我们就会得到一个分辨率不断下降的图像金字塔。
 
       我们可以使用函数 cv2.pyrDown() cv2.pyrUp() 构建图像金字塔。
函数 cv2.pyrDown() 从一个高分辨率大尺寸的图像向上构建一个金子塔 (尺寸变小,分辨率降低)。
     
img = cv2.imread('messi5.jpg')
lower_reso = cv2.pyrDown(higher_reso)
下图是一个四层的图像金字塔。

高斯拉普拉斯——图像金字塔_第1张图片

      函数 cv2.pyrUp() 从一个低分辨率小尺寸的图像向下构建一个金子塔(尺 寸变大,但分辨率不会增加)。
 
 
  higher_reso2 = cv2.pyrUp(lower_reso)
   在这种情况下,图像首先在每个维度上扩大为原来的两倍,新增的行(偶数行)以0填充。然后给指定的滤波器进行卷积(实际上是一个在每一维上都扩大为两倍的过滤器)去估计“丢失”像素的近似值。
        所以PyrUp()并不是PyrDown的逆操作。因为一旦使 用 cv2.pyrDown(),图像的分辨率就会降低,信息就会被丢失。
 
 

二、拉普拉斯金字塔

     为了恢复原来(更高分辨率)的图像,我们需要获得由降采样操作丢失的信息。 这些数据形成了拉普拉斯金字塔。
   拉普拉斯金字塔可以有高斯金字塔计算得来,公式如下:

高斯拉普拉斯——图像金字塔_第2张图片

  使用openCV直接进行拉普拉斯运算:
      L i = G i   - PyrUp ( G i +1 )
 
 
 
拉普拉金字塔的图像看起来就像边界图,其中很多像素都是 0。他们经常 被用在图像压缩中。下图就是一个三层的拉普拉斯金字塔:
 
高斯拉普拉斯——图像金字塔_第3张图片
 
 
 

附图:高斯金字塔及其逆形式——拉普拉斯金字塔:

 
 
高斯拉普拉斯——图像金字塔_第4张图片
 

三、图像金字塔的应用

3.1 图像融合
  
金字塔的一个应用是图像融合。例如,在图像缝合中,你需要将两幅 图叠在一起,但是由于连接区域图像像素的不连续性,整幅图的效果看起来会 很差。这时图像金字塔就可以排上用场了,他可以帮你实现无缝连接。这里的 一个经典案例就是将两个水果融合成一个,看看下图也许你就明白我在讲什么 了。
高斯拉普拉斯——图像金字塔_第5张图片
 
实现上述效果的步骤如下:
1. 读入两幅图像,苹果和句子。
2. 构建苹果和橘子的高斯金字塔( 6 层)。
3. 根据高斯金字塔计算拉普拉斯金字塔。
4. 在拉普拉斯的每一层进行图像融合(苹果的左边与橘子的右边融合)
5. 根据融合后的图像金字塔重建原始图像。
 
3.2 图像分割
 
   见cbPyrSegmentation()函数使用。
 
 
 
 

参考:

1.openCV官方教程;

2.学习openCV

你可能感兴趣的:(高斯拉普拉斯——图像金字塔)