python - OpenCV-平滑边框

标签 python opencv image-processing

我想将多个图像补丁拼接到一个新的且主要是灰色的背景图像上。图像修补程序包含有色元素,如果可能,不得更改。它们的形状和颜色是多种多样的。像新的背景图像一样,图像补丁的边界也为灰色,只是略有不同,但是如果我经过,您会看到很强的边界

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()尝试了不同的面具,没有一种尝试过的方法起作用。因此,不幸的是,到目前为止,我无法找到正确的方法来仅融合补丁的边界。

下图以非常抽象的方式形象化了我的问题。

是)我有的:

左:背景,右:图像补丁

Left: Background, Right: Image patch

我想要的是:

Wanted result

我目前通过使用cv2.seamlessClone()得到的内容:

Current result

任何帮助将不胜感激!

编辑我可能还不够清楚:真实图像更加复杂,因此不幸的是,我无法使用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)

result

关于python - OpenCV-平滑边框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51266831/

相关文章:

python - Numpy 翻转坐标系

python - 如何在 PyYaml 中添加自定义嵌套标签?

c++ - 通过从Opencv中的一个正方形检测到的4个点计算俯仰,横滚和偏航

opencv - 未能形成二分类并使用 predict_prob() : Random Forest, opencv

python - 从元类访问构造函数的参数

python - 使用 Python 抓取网页

opencv - 替换cv::imencode

image-processing - 将 Vector<Point> 转换为 Mat

python - 从传入的 MJPEG 流中跟踪 OpenCV 中的对象

c++ - 用于选择颜色的轨迹栏。使用C++、opencv