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
其中 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
我的代码有什么明显的问题吗?
提前致谢
解决方案
嗨,我不确定到底是什么问题,但我认为您需要在应用混合时反转遮罩。
这是我似乎有效的代码:
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 之间。
希望这可以帮助!
推荐阅读
- ios - Swift DSL - 如何根据已知的常量数据创建平面字典?
- rust - 如何在编译时创建字母数组?
- php - 使这个查询更简单
- java - 无法执行目标 .maven.plugins:maven-compiler-plugin:3.8.0:compile on project fast-grill: Fatal error compile: java.lang.NullPointerException
- c++ - 从继承的模板类中正确实现虚函数
- node.js - 如何在循环中使用描述?
- haskell - Haskell中具有自定义索引类型的静态数组
- reactjs - 为什么我无法在下拉菜单中的搜索字段中找到光标?
- android - 合并 dex 档案时构建 APK 错误时出现错误
- sql-server - 如何处理跨多个表插入大量数据(1500 万)的事务