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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在opencv中将绘制在图像上的画笔绘图保存为填充和单独的二进制掩码?相关的知识,希望对你有一定的参考价值。

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

首先,我有一个图像:

enter image description here

接下来,我用鼠标在“鼠标作为画笔”教程之后绘制它。结果如下:

enter image description here

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

enter image description here

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

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

我应该使用像开罗这样的外部库吗?我试图在Python 3.5中这样做。请指教,任何帮助将不胜感激!

答案

再次更新

您绝对可以创建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's 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中将绘制在图像上的画笔绘图保存为填充和单独的二进制掩码?的主要内容,如果未能解决你的问题,请参考以下文章

如何将绘图保存为磁盘上的图像?

如何将绘图保存为磁盘上的图像?

如何在 Swift 中将绘图保存到 tableview?

OpenCV 中的 Gui 特性——4鼠标绘图

OpenCV 图像处理:常用绘图函数

本周新学的 GUI绘图技术