Python-OpenCV-图像金字塔

本文详细介绍了图像金字塔的概念,包括高斯金字塔的构建方法(通过向下采样生成不同分辨率的图像),以及拉普拉斯金字塔的处理过程。重点讲述了如何通过融合两个图像的金字塔来实现图像融合技术的应用。
摘要由CSDN通过智能技术生成

图像金字塔是由一幅图像的多个不同分辨率的子图所构成的图像集合。该组图像是由单个图像通过不断地降采样所产生的。

图像金字塔是图像中多尺度表达的一种,主要用于图像分割

图像金字塔的底部一般是待处理的高分辨率图像,顶部为其低分辨率的图像。金字塔的部向顶部移动时,图像的尺寸和分辨率都会随之降低。通常情况下,每向顶部移动一级,图像的宽和高都会减少一半

高斯金字塔

向下采样dst = cv2.pyrDown( src[, dstsize[, borderType]] )

向上采样dst = cv2.pyrUp( src[, dstsize[, borderType]] )

(向下和先上采样会逐渐丢失图像信息,且过程不可逆)

高斯金字塔由底部的最大分辨率图像逐次向下采样得到。

拉普拉斯金字塔

残差金字塔,用来存储下采样后图片与原始图片的差异。

拉普拉斯金字塔在每次向下采样后,将再次向上采样,得到向上采样的 Up(Down(img)) 后,记录 Up(Down(img)) 与 img 的差异信息。

# 先向下采样

img_down0 = cv2.pyrDown(img)

img_down1 = cv2.pyrDown(img_down0)

img_down2 = cv2.pyrDown(img_down1)

# 再向上采样

img_up2 = cv2.pyrUp(img_down2)

img_up1 = cv2.pyrUp(img_up2)

img_up0 = cv2.pyrUp(img_up1)

# 拉普拉斯金字塔

img_down1_up=cv2.pyrUp(img_down1)

# 注意图像尺寸要匹配

h0,w0 = img_down0.shape[:2]

img_down1_up=cv2.resize(img_down1_up,(w0,h0))

L0 = img_down0 - img_down1_up

img_down2_up=cv2.pyrUp(img_down2)

h1,w1 = img_down1.shape[:2]

img_down2_up=cv2.resize(img_down2_up,(w1,h1))

L1 = img_down1 - img_down2_up

# 拉普拉斯变换(恢复原始图像)

img_L0 =L0 + cv2.resize(cv2.pyrUp(img_down1),L0.shape[1::-1])

img_L1 = L1 + cv2.resize(cv2.pyrUp(img_down2),L1.shape[1::-1])

图像融合
图像金字塔可以实现图像融合。

# 高斯金字塔向下采样

def PyramidDown(g,num):

    G=g.copy()

    gp = [G]

    for i in range(num):

        G = cv2.pyrDown(G)

        gp.append(G)

    return gp

# 拉普拉斯金字塔

def LaplacianPyramid(gp,num):

    lp = [gp[num]]  

    for i in range(num,0,-1):

        G=cv2.pyrUp(gp[i])

        size=gp[i-1].shape[1::-1]

        G1=cv2.resize(G,size)

        L = gp[i-1]-G1

        lp.append(L)

    return lp

a = cv2.imread('image/apple.png')

b = cv2.imread('image/orange.png')

# 将红苹果进行高斯金字塔处理,总共6级处理

gpa=PyramidDown(a,6)

# 将青苹果进行高斯金字塔处理,总共6级处理

gpb=PyramidDown(b,6)    

# 将红苹果进行拉普拉斯金字塔处理,总共5级处理

lpa=LaplacianPyramid(gpa,5)

# 将青苹果进行拉普拉斯金字塔处理,总共5级处理

lpb=LaplacianPyramid(gpb,5)

# 依次拼接

LS = []

for la,lb in zip(lpa,lpb):

    h,w = la.shape[:-1]

    # 将参数元组的元素数组按水平方向进行叠加

    ls = np.hstack((la[:,0:w//2], lb[:,w//2:]))

    LS.append(ls)

# 融合

Ls = LS[0]

for i in range(1,6):

    Ls = cv2.pyrUp(Ls)

    Ls=cv2.resize(Ls,LS[i].shape[1::-1])

    Ls = Ls+LS[i]

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值