opencv图像金字塔

1 原理

一般情况下,我们要处理是一副具有固定分辨率的图像。但是有些情况下,我们需要对同一图像的不同分辨率的子图像进行处理。比如,我们要在一幅图像中查找某个目标,比如脸,我们不知道目标在图像中的尺寸大小。这种情况下,我们需要创建一组图像,这些图像是具有不同分辨率的原始图像。我们把这组图像叫做图像金字塔(简单来说就是同一图像的不同分辨率的子图集合)。如果我们把最大的图像放在底部,最小的放在顶部,看起来像一座金字塔,故而得名图像金字塔。

有两类图像金字塔:高斯金字塔和拉普拉斯金字塔。

1.1高斯金字塔

高斯金字塔的顶部是通过将底部图像中的连续的行和列去除得到的。顶部图像中的每个像素值等于下一层图像中 5 个像素的高斯加权平均值。这样操作一次一个 MxN 的图像就变成了一个 M/2xN/2 的图像。所以这幅图像的面积就变为原来图像面积的四分之一。这被称为 Octave。连续进行这样的操作我们就会得到一个分辨率不断下降的图像金字塔。我们可以使用函数cv2.pyrDown()和cv2.pyrUp()构建图像金字塔。

函数 cv2.pyrDown() 从一个高分辨率大尺寸的图像向上构建一个金子塔(尺寸变小,分辨率降低)。

img = cv2.imread('opencv_logo.jpg',0)

lower_reso = cv2.pyrDown(img)


while(1):

    cv2.imshow('img',img)

    cv2.imshow('lower_reso',lower_reso)

    if cv2.waitKey() == ord('q'): break

cv2.destroyAllWindows()


opencv图像金字塔_第1张图片

cv2.pyrUp从一个低分辨率小尺寸的图像向上构建一个金字塔(尺寸变大,但分辨率不会增加)

higher_reso = cv2.pyrUp(img)

opencv图像金字塔_第2张图片

1.2.拉普拉斯金字塔

拉普拉斯金字塔可以由高斯金字塔计算得来。公式如下:

拉普拉斯金字塔的图像看起来就像是边界图,其中很多像素都是0,常被用在图像压缩中。

2.使用金字塔进行图像融合

在图像缝合中,由于连接区域图像像素的不连续,整幅图看起来会很差,金字塔就可以实现无缝连接。

经典例子就是水果融合。

实现步骤:

1). 读入两幅图像,苹果和句子

2). 构建苹果和橘子的高斯金字塔(6 层)

3). 根据高斯金字塔计算拉普拉斯金字塔

4). 在拉普拉斯的每一层进行图像融合(苹果的左边与橘子的右边融合)

5). 根据融合后的图像金字塔重建原始图像。

下图是摘自《学习 OpenCV》展示了金子塔的构建,以及如何从金字塔重建原

始图像的过程。

opencv图像金字塔_第3张图片

代码如下:

opencv图像金字塔_第4张图片
opencv图像金字塔_第5张图片

PS:1)这边需要注意一个numpy的版本,在1.12版本以上的,取整是3//2,而在此版本之前,取整是3/2

      2)图像先经过降采样,然后再上采样恢复的时候大小可能不同,这会导致后面的拼接出现问题,因为调用函数cv2.subtrack()和函数cv2.add()需要保证两幅图像尺寸、通道数完全相同,否则会报错,所以这边比源码多了一个自定义的resize函数

你可能感兴趣的:(opencv图像金字塔)