首页 > 解决方案 > 与拉普拉斯金字塔混合的图像产生不良图像

问题描述

我正在尝试实现一个图像混合算法,它接收两个图像 im1、im2 和一个二进制掩码,并将两个图像混合到该掩码。我正在使用以下公式:

https://i.stack.imgur.com/uxz34.png

构建混合图像的拉普拉斯金字塔,然后重建它以接收最终图像。

我的代码:

mask = mask.astype(np.float64)
pyr_im1, filter_vec = build_laplacian_pyramid(im1, max_levels,
                                              filter_size_im)
pyr_im2 = build_laplacian_pyramid(im2, max_levels,
                                  filter_size_im)[0]
pyr_mask = build_gaussian_pyramid(mask, max_levels,
                                  filter_size_mask)[0]

# build the blended laplacian pyramid

l_out = [np.multiply(pyr_mask[k], pyr_im1[k])
         + np.multiply(1 - pyr_mask[k], pyr_im2[k])
         for k in range(len(pyr_im1))]

im_blend = laplacian_to_image(l_out, filter_vec, [1] * len(l_out))
im_blend = np.clip(im_blend, 0, 1)  # clip values to the range of [0,1]

return im_blend

其中 mask 是值为 0 或 1 的二进制掩码,im1 和 im2 是归一化为 (0,1) 范围的 np.float64 图像。函数 build_laplacian_pyramid、build_gaussian_pyramid 和 laplacian_to_image 工作得很好——我已经对它们进行了测试并确保它们正常工作。当我使用此代码尝试混合两个图像时,我得到如下结果:

https://i.stack.imgur.com/0NlKv.png

我的代码有什么明显的问题吗?

提前致谢

标签: pythonimageimage-processing

解决方案


嗨,我不确定到底是什么问题,但我认为您需要在应用混合时反转遮罩。

这是我似乎有效的代码:

def laplacianSameSize(outerImage, innerImage, mask, levels):

gpCEye = gaussianPyramid(innerImage, levels)
lpCEye = laplacianPyramid(gpCEye)
gpFrame = gaussianPyramid(outerImage, levels)
lpFrame = laplacianPyramid(gpFrame)

gpMask = gaussianPyramid(mask, levels)

gpMask.reverse()
LS = []
#Appling the mask
for lFrame, lCEye, gMask in zip(lpFrame, lpCEye, gpMask):
    lFrame[gMask == 255] = lCEye[gMask == 255]
    LS.append(lFrame)

# now reconstruct
ls_ = LS[0]
for i in range(1,levels+1):
    size = (LS[i].shape[1], LS[i].shape[0])
    ls_ = cv2.pyrUp(ls_,dstsize=size)
    ls_ = ls_ + LS[i]

#Making it above 0 before becoming uint8
bound(ls_)
return ls_.astype(np.uint8)

有功能

def laplacianPyramid(gp):
levels = len(gp) - 1
lp = [gp[levels]]
for i in range(levels, 0, -1):
    size = (gp[i - 1].shape[1], gp[i - 1].shape[0])
    GE = cv2.pyrUp(gp[i], dstsize=size)
    L = gp[i - 1] - GE
    lp.append(L)
return lp

def gaussianPyramid(img, num_levels):
lower = img.copy()
gp = [np.float32(lower)]
for i in range(num_levels):
    lower = cv2.pyrDown(lower)
    gp.append(np.float32(lower))
return gp

def bound(im):
   im[im < 0] = 0
   im[im > 255] = 255

我还确保使用浮点数直到结束,然后将其限制在 0 到 255 之间。

希望这可以帮助!


推荐阅读