如何在opencv中将绘制在图像上的画笔绘图保存为填充和单独的二进制蒙版?

时间:2018-10-02 04:12:58

标签: opencv python-3.5 mask

在openCV教程中,有一个"mouse as a paintbrush" tutorial演示了如何在图像上进行绘制。我知道如何使用imwrite函数保存结果,但是如何仅保存绘制和填充的轮廓并将其另存为黑白二进制蒙版?

首先,我有一张图片:

enter image description here

接下来,我将按照“鼠标作为画笔”教程中的内容使用鼠标进行绘制。结果是:

enter image description here

否,我想将原始图像和草图分开以获取此图像:

enter image description here

这就是我要保存到文件的内容。

没有任何代码可上传,因为我现在没有的蒙版(第三个图片)不是从草图中获得的。它来自蒙版注释。现在的问题是,如何将用户的草图作为单独的图层与原始图像分开?我试图四处寻找答案,但似乎似乎只合并了功能而不是分开了。

我应该使用像Cairo这样的外部库吗?我正在尝试在Python 3.5中执行此操作。请告知,任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

再次更新

您绝对可以创建一个Alpha通道并将其添加到图像中。看起来可能像这样:

# Split image into its three constituent channels, R, G and B
R, G, B = cv2.split(image)

# Make a same-shape alpha channel, initially opaque (255)
alpha   = np.ones_like(R)*255

# Merge R, G, B and alpha into a 4-channel image
imgwithalpha = cv2.merge((R, G, B, alpha))

唯一的问题是OpenCV的imshow()忽略了alpha,而imwrite()遵循alpha并将其保存到磁盘。因此,我会像您一样将蒙版涂成红色(以便用户看到),但同时还要将蒙版保存为黑白。然后,最后,将黑色和白色合并为一个Alpha通道,如上所示-在需要透明的地方为黑色,在需要不透明的地方为白色。

更新后的答案

因此,看起来您的代码与OpenCV示例代码有些不同,并且实际上您正在加载其他图像,而不是它们使用的黑色图像。没关系,将黑色图像制作成与您的鸟相同的大小(使用numpy zeros_like(bird)。然后,当您在鸟上绘制时,在黑色副本上绘制相同的白色铅笔。最后,使用{{1 }},以(0,0)为种子,填充黑色图像上鸟以外的所有区域,并将其保存如下。

原始答案

我不确定我是否理解您的问题,所以我将回答您认为的问题,看看是否能找到正确的解决方案。

您链接到的代码会像下面这样创建一个空的黑色画布512x512:

floodFill()

然后,每次单击鼠标时,都会在其上绘制圆圈。因此,您只需要在退出前保存该图像即可。因此,将其添加为最后一行:

img = np.zeros((512,512,3), np.uint8)