绘制 OpenCV 轮廓并保存为透明图像

Posted

技术标签:

【中文标题】绘制 OpenCV 轮廓并保存为透明图像【英文标题】:Drawing OpenCV contours and save as transparent image 【发布时间】:2020-08-02 23:33:47 【问题描述】:

我正在尝试绘制使用 findContours 找到的轮廓。

如果我这样画,我会得到一个黑色背景,上面画着轮廓。

    out = np.zeros_like(someimage)
    cv2.drawContours(out, contours, -1, 255, 1)
    cv2.imwrite('contours.png',out)

如果我这样画,我会得到一个完全透明的图像,没有绘制轮廓。

    out = np.zeros((55, 55, 4), dtype=np.uint8)
    cv2.drawContours(out, contours, -1, 255, 1)
    cv2.imwrite('contours.png',out)

如何制作尺寸为 (55,55) 的图像并在其上绘制轮廓,同时保持透明背景?

谢谢

【问题讨论】:

【参考方案1】:

要在 OpenCV 中处理透明图像,您需要使用 BGR 之后的第四个通道,称为 alpha 并对其进行控制。因此,不要创建一个三通道图像,而是创建一个具有四个通道的图像,并且在绘图时确保将第四个通道分配给 255。

mask = np.zeros((55, 55, 4), dtype=np.uint8)
cv2.drawContours(mask, cnts, -1, (255, 255, 255, 255), 1) #change first three channels to any color you want.
cv2.imwrite('res.png', mask)

输入要绘制轮廓的图像。

结果

【讨论】:

该死,这很简单。【参考方案2】:

在 Python/OpenCV 中,将黑白图像用作 Alpha 通道,并将其用于 3 通道 BGR 图像。

cntr_img = np.zeros((55, 55, 4), dtype=np.uint8)
cv2.drawContours(cntr_img, contours, -1, 255, 1)
out = cv2.cvtColor(cntr_img, cv2.COLOR_GRAY2BGRA)
out[:,:,3] = cntr_img
cv2.imwrite('contours.png',out)

【讨论】:

我已经试过了 = cv2.cvtColor(cntr_img, cv2.COLOR_GRAY2BGRA)。但它给了我这个错误“输入图像中的通道数无效:> 'VScn::contains(scn)' > where > 'scn' is 4”。我正在像这样加载 someimage someimage = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)【参考方案3】:

这在 Python/OpenCV 中适用于我。我使用黑色背景上的白色斑点作为输入,因为我没有可用的轮廓图像。轮廓图需要是灰度图。

输入:

import cv2
import numpy as np

# read image
img = cv2.imread('mask.png')

# convert to gray
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

out = cv2.cvtColor(gray, cv2.COLOR_GRAY2BGRA)
out[:,:,3] = gray

# write output
cv2.imwrite('mask_transp.png',out)

# display it
cv2.imshow("out", out)
cv2.waitKey(0)
透明结果(下载以查看它,因为它在透明背景上是白色的):

【讨论】:

以上是关于绘制 OpenCV 轮廓并保存为透明图像的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV与EmguCV中的图像轮廓提取

python --opencv图像处理轮廓(寻找轮廓绘制轮廓)详解

将OpenCV函数findContours()得到的每一个轮廓单独绘制并保存为图片文件的Python代码

Opencv和python获取文档正确的轮廓并在图像上绘制

使用Python,OpenCV进行基本的图像处理——提取红色圆圈轮廓并绘制

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