在 OpenCV python 中使用 seamlessClone 生成具有 "ghost" 个对象的图像

Using seamlessClone in OpenCV python produces image with "ghost" objects

我正在尝试将具有 完全紧密 已知蒙版的对象粘贴到图像上,因此应该很容易,但如果没有一些 post 处理,我会得到人工制品边界。 我想使用混合技术 Poisson Blending 来减少伪像。在opencv中实现 seamlessClone.

import cv2
import matplotlib.pyplot as plt
#user provided tight mask array tight_mask of dtype uint8 with only white pixel the ones on the object the others are black (50x50x3)
tight_mask
#object obj to paste a 50x50x3 uint8 in color
obj
#User provided image im which is large 512x512 of a mostly uniform background in colors
im
#two different modes of poisson blending, which give approximately the same result
normal_clone=cv2.seamlessClone(obj, im, mask, center, cv2.NORMAL_CLONE)
mixed_clone=cv2.seamlessClone(obj, im, mask, center, cv2.MIXED_CLONE)
plt.imshow(normal_clone,interpolation="none")
plt.imshow(mixed_clone, interpolation="none")

但是,使用上面的代码,我只能得到粘贴对象非常非常透明的图像。所以它们显然混合得很好,但它们混合得如此之深,以至于它们像物体的幽灵一样消失了。

我想知道我是否是唯一遇到此类问题的人,如果不是,在泊松混合方面有哪些替代方案?
我是否必须从头开始重新实现它以修改混合因子(甚至可能吗?),还有另一种方法吗?我是否必须在蒙版上使用扩张来减少混合?之后我能以某种方式增强对比度吗?

泊松混合其实就是利用图像中的梯度信息粘贴混合到目标图像中。

事实证明,如果蒙版完全紧密,则边界梯度会被人为地解释为空。 这就是为什么它完全忽略它并产生重影的原因。

通过使用形态学操作扩大原始蒙版并因此包括一些背景来使用更大的蒙版是解决方案。

在选择包含的背景颜色时必须小心,如果对比度太大,渐变太强,图像就不会很好地融合。 使用像灰色这样的颜色是一个很好的起点。