在openCV教程中,有一个"mouse as a paintbrush" tutorial演示了如何在图像上进行绘制。我知道如何使用imwrite函数保存结果,但是如何仅保存绘制和填充的轮廓并将其另存为黑白二进制蒙版?
首先,我有一张图片:
接下来,我将按照“鼠标作为画笔”教程中的内容使用鼠标进行绘制。结果是:
否,我想将原始图像和草图分开以获取此图像:
这就是我要保存到文件的内容。
没有任何代码可上传,因为我现在没有的蒙版(第三个图片)不是从草图中获得的。它来自蒙版注释。现在的问题是,如何将用户的草图作为单独的图层与原始图像分开?我试图四处寻找答案,但似乎似乎只合并了功能而不是分开了。
我应该使用像Cairo这样的外部库吗?我正在尝试在Python 3.5中执行此操作。请告知,任何帮助将不胜感激!
答案 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)