如何在opencv中将绘制在图像上的画笔绘图保存为填充和单独的二进制掩码?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在opencv中将绘制在图像上的画笔绘图保存为填充和单独的二进制掩码?相关的知识,希望对你有一定的参考价值。
在openCV教程中,这个"mouse as a paintbrush" tutorial演示了如何在图像上绘制。我知道如何使用imwrite函数保存结果,但是如何仅保存绘制和填充的轮廓并将其保存为黑白二进制掩码?
首先,我有一个图像:
接下来,我用鼠标在“鼠标作为画笔”教程之后绘制它。结果如下:
不,我想将原始图像和草图分开以获得:
这就是我要保存到文件的内容。
没有可上传的代码,因为我现在拥有的掩模(第三张图片)不是从草图中获得的。它来自面具注释。我现在的问题是,如何将用户的草图作为单独的图层与原始图像分开?我试图寻找答案,但似乎主要只是合并函数而不是分离它们。
我应该使用像开罗这样的外部库吗?我试图在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中将绘制在图像上的画笔绘图保存为填充和单独的二进制掩码?的主要内容,如果未能解决你的问题,请参考以下文章