图像与拉普拉斯金字塔混合会产生不良图像

2024-04-28 15:06:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试实现一种图像混合算法,它接收两幅图像 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

其中,掩码是值为0或1的二进制掩码,im1和im2为np.64 标准化为(0,1)范围的图像。函数建立了拉普拉斯金字塔, 建立高斯金字塔和拉普拉斯图像完美地工作-我已经测试过了 并确保它们正常工作。当我使用此代码尝试 混合两幅图像,我得到如下结果:

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

我的代码中是否存在任何可能出现的问题

提前谢谢


Tags: 代码图像buildpyramidnpmaskfiltermax
1条回答
网友
1楼 · 发布于 2024-04-28 15:06:46

嗨,我不确定到底出了什么问题,但我认为你需要在涂抹混合液时反转面膜

以下是我的代码,似乎很有效:

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之间

希望这有帮助

相关问题 更多 >