【问题标题】:How to save paint-brush drawings drawn over images as a filled and separate binary mask in opencv?如何将在图像上绘制的画笔绘图保存为opencv中的填充和单独的二进制掩码?
【发布时间】:2019-03-07 04:49:55
【问题描述】:

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

首先,我有一张图片:

接下来,我按照“鼠标作为画笔”教程用鼠标在它上面画画。结果是这样的:

不,我想将原始图像和我的草图分开以获得这个:

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

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

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

【问题讨论】:

  • 请出示生成这些图像的代码。您链接到的代码似乎绘制了圆形或矩形,但这看起来也不像!
  • 该链接显示了如何绘制连续的圆圈,因此通过使用小圆圈并在其周围连续拖动鼠标将产生一个简单的绘图应用程序。我没有上传生成这些图像的代码,因为我觉得这与我的问题无关,因为我本质上想知道如何将图像叠加草图保存为单独的蒙版图像。这些图像是通过与手头任务无关的方法获得的。它们只是粗略的例子,但我很欣赏你的 cmets :)
  • 我的回答解决了你的问题吗?如果是这样,请考虑接受它作为您的答案 - 通过单击计票旁边的空心对勾/复选标记。如果没有,请说出什么不起作用,以便我或其他人可以进一步帮助您。谢谢。 meta.stackexchange.com/questions/5234/…
  • 嗨@MarkSetchell,不幸的是,它没有...我不想合并,我想分割一个绘制的图像。

标签: opencv python-3.5 mask


【解决方案1】:

再次更新

您绝对可以创建一个 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)。然后,当您在鸟上绘制时,在黑色副本上用白色绘制相同的curcle。最后,使用floodFill() 和( 0,0) 作为种子填充黑色图像上鸟以外的所有区域并保存如下。

原答案

我不确定我是否理解你的问题,所以我会回答我认为你在问的问题,看看这是否会导致正确的解决方案。

您链接到的代码会创建一个 512x512 的空白黑色画布,如下所示:

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

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

cv2.imwrite('mask.png',img)

【讨论】:

  • 对不起...我认为我的问题措辞很糟糕。也许我会尝试改写和编辑我的问题。非常感谢您尝试帮助我!
  • 我已根据您修改后的问题更新了我的答案。
  • 感谢更新,但我想避免这样做,这就是我问的原因。就像我宁愿在原始图像上添加一个透明层,让用户在透明层上绘制并保存透明层。我想它不可能在 openCV 中做到这一点......
  • 好的,我再次更新了我的答案。请再看看。
猜你喜欢
  • 2019-10-16
  • 2018-09-27
  • 2019-03-12
  • 1970-01-01
  • 1970-01-01
  • 2019-10-19
  • 2022-01-27
  • 1970-01-01
  • 2022-01-09
相关资源
最近更新 更多