我想将多个图像补丁拼接到一个新的且主要是灰色的背景图像上。图像修补程序包含有色元素,如果可能,不得更改。它们的形状和颜色是多种多样的。像新的背景图像一样,图像补丁的边界也为灰色,只是略有不同,但是如果我经过,您会看到很强的边界
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
获得所有图像补丁的合理结果...我正在寻找的是一种合并边界的方法,因此您再也看不到补丁到背景的确切过渡。
最佳答案
patch = cv2.imread('patch.png', cv2.IMREAD_UNCHANGED);
image = cv2.imread('image.png', cv2.IMREAD_UNCHANGED);
mask = 255 * np.ones(patch.shape, patch.dtype)
width, height, channels = image.shape
center = (height//2, width//2)
mixed_clone = cv2.seamlessClone(patch, image, mask, center, cv2.cv2.NORMAL_CLONE)
关于python - OpenCV-平滑边框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51266831/