【发布时间】:2018-07-10 13:40:53
【问题描述】:
我想将多个图像补丁拼接到一个新的主要是灰色背景图像上。如果可能,图像补丁包含不应更改的彩色元素。它们的形状和颜色多种多样。和新的背景图片一样,图片补丁的边框也是灰色的,只是略有不同,但如果我路过,你会看到强烈的边框
ImgPatch = cv2.imread("C://...//ImagePatch.png")
NewBackground = cv2.imread("C://...//NewBackground.png")
height, width, channels = ImgPatch.shape
NewBackground[y:y+height,x:x+width] = ImgPatch
我按照本教程中的说明尝试了cv2.seamlessClone() (docs.opencv.org):
www.learnopencv.com/seamless-cloning-using-opencv-python-cpp
边缘完美平滑,但不幸的是元素的颜色变化太多。我知道每个图像补丁的灰色边框的大致宽度和高度。如果我可以特别平滑那个可能是一个开始的区域,并让结果看起来已经比我拥有的更好。我用cv2.seamlessClone() 尝试了不同的面具,但没有一种尝试过的方法有效。所以不幸的是,到目前为止,我找不到正确的方法来仅混合补丁的边界。
以下图片以非常抽象的方式可视化了我的问题。
我有什么:
左:背景,右:图像补丁
我想要什么:
我目前使用cv2.seamlessClone()得到的结果:
任何帮助将不胜感激!
编辑因为我可能不够清楚:真实图像要复杂得多,所以不幸的是,我无法通过使用 cv2.findContour 获得所有图像补丁的合理结果...我是什么寻找是一种合并边界的方法,因此您无法再看到补丁到背景的确切过渡。
【问题讨论】:
-
cv2.seamlessClone()在这里帮不了你。它试图使对象融入背景图像的周围环境中。 -
是的,我已经放弃了这种方法。我目前正在尝试不同的想法,例如使用
cv2.GaussianBlur()或其他方法模糊边界。但到目前为止,没有什么看起来很好。有什么好主意可能是最好的方法吗?我不是真正的 openCV 专家... -
您的实际情况要复杂多少?提问时最好简化,但如果简化太多,就会得到过于简单的答案。补丁的背景是否总是相同的灰色?补丁中其他地方的背景颜色是否可见?如果没有,你应该可以使用蓝屏技术(灰屏?)。
-
你解决了吗?我遇到了同样的问题。我只是想消除边框但无缝克隆做得太多了!我认为@Kunibert 只是想要一个“不太有效”的无缝克隆,就像我一样。
标签: python opencv image-processing