简介
图像金字塔是图像中多尺度表达的一种,最主要用于图像的分割,是一种以多分辨率来解释图像的有效但概念简单的结构。简单来说,图像金字塔就是用来进行图像缩放的。
进行图像缩放可以用图像金字塔,也可以使用resize函数进行缩放,后者效果更好。这里只是对图像金字塔做一些简单了解。
金字塔类型
一般图像金字塔类型主要有高斯金字塔和拉普拉斯金字塔。
高斯金字塔:用于下采样。高斯金字塔是最基本的图像塔。原理:首先将原图像作为最底层图像G0(高斯金字塔的第0层),利用高斯核(5*5)对其进行卷积,然后对卷积后的图像进行下采样(去除偶数行和列)得到上一层图像G1,将此图像作为输入,重复卷积和下采样操作得到更上一层图像,反复迭代多次,形成一个金字塔形的图像数据结构,即高斯金字塔。
拉普拉斯金字塔:用于重建图像,也就是预测残差,对图像进行最大程度的还原。比如一幅小图像重建为一幅大图。原理:用高斯金字塔的每一层图像减去其上一层图像上采样并高斯卷积之后的预测图像,得到一系列的差值图像即为拉普拉斯金字塔。
图像金字塔采样类型
采样分为上采样和下采样。
上采样:upsample,就是放大图像,使用cv2.pyrUp函数。上采样步骤:先将图像在每个方向放大为原来的两倍,新增的行和列用0填充,再使用先前同样的内核与放大后的图像卷积,获得新增像素的近似值。
下采样:downsample,就是缩小图像,使用cv2.pyrDown函数。下采样将步骤:先对图像进行高斯内核卷积 ,再将所有偶数行和列去除。
高斯金字塔和拉普拉斯金字塔的python实现如下
import cv2
# 图像金字塔
# 高斯金字塔
def pyramid_demo(image):
level = 3 # 设置金字塔的层数为5
temp = image.copy() # 拷贝图像
pyramid_images = [] # 拉普拉斯金字塔用到
for i in range(level):
dst = cv2.pyrDown(temp) # 先对图像进行高斯平滑,然后进行降采样(将图像尺寸行和列方向缩减一半)
pyramid_images.append(dst)
cv2.imshow("pyramid"+str(i), dst)
temp = dst.copy()
return pyramid_images
# 拉普拉斯金字塔
def lapalian_demo(image):
pyramid_images = pyramid_demo(image) # 做拉普拉斯金字塔必须用到高斯金字塔的结果
level = len(pyramid_images)
for i in range(level-1, -1, -1):
if i-1 < 0:
expand = cv2.pyrUp(pyramid_images[i], dstsize=image.shape[:2])
cv2.imshow("expand - %s" % str(i), expand)
lpls = cv2.subtract(image, expand) # 两图象像像素做减法
cv2.imshow("lapalian_down_"+str(i), lpls)
else:
expand = cv2.pyrUp(pyramid_images[i], dstsize=pyramid_images[i-1].shape[:2])
cv2.imshow("expand - %s" % str(i), expand)
lpls = cv2.subtract(pyramid_images[i-1], expand)
cv2.imshow("lapalian_doown_"+str(i), lpls)
src = cv2.imread("./mm.jpg")
src = cv2.resize(src, (min(src.shape[:2]), min(src.shape[:2]))) # 在进行拉普拉斯金字塔时,必须保证图像的W和H大小一样,否则会报错
print(src.shape)
cv2.imshow("input", src)
# pyramid_demo(src)
lapalian_demo(src)
cv2.waitKey(0)
cv2.destroyAllWindows()
高斯金字塔处理结果
拉普拉斯金字塔: