Python和OpenCV:如何将该图像的所有背景转换为一种颜色或透明

Python和OpenCV:如何将该图像的所有背景转换为一种颜色或透明,第1张

Python和OpenCV:如何将该图像的所有背景转换为一种颜色或透明

只需

floodFill()
从图像的边界用黑色蒙版即可。请在此处查看我的答案中的洪水填充步骤,以查看它是否已在其他情况下使用。

同样,您可以

floodFill()
用来查找哪些像素连接到图像的边缘,这意味着您可以使用它来消除阈值后肺部的孔洞。请参阅我的答案,以获取有关此孔填充过程的其他示例。

我直接从上面的答案中复制并粘贴了代码,只修改了变量名:

import cv2import numpy as npimg = cv2.imread('img.jpg', 0)mask = cv2.imread('mask.png', 0)# flood fill to remove mask at borders of the imageh, w = img.shape[:2]for row in range(h):    if mask[row, 0] == 255:        cv2.floodFill(mask, None, (0, row), 0)    if mask[row, w-1] == 255:        cv2.floodFill(mask, None, (w-1, row), 0)for col in range(w):    if mask[0, col] == 255:        cv2.floodFill(mask, None, (col, 0), 0)    if mask[h-1, col] == 255:        cv2.floodFill(mask, None, (col, h-1), 0)# flood fill background to find inner holesholes = mask.copy()cv2.floodFill(holes, None, (0, 0), 255)# invert holes mask, bitwise or with mask to fill in holesholes = cv2.bitwise_not(holes)mask = cv2.bitwise_or(mask, holes)# display masked imagemasked_img = cv2.bitwise_and(img, img, mask=mask)masked_img_with_alpha = cv2.merge([img, img, img, mask])cv2.imwrite('masked.png', masked_img)cv2.imwrite('masked_transparent.png', masked_img_with_alpha)

编辑:顺便说一句,“透明度”基本上是一个蒙版:这些值告诉您每个像素的不透明度。如果像素为0,则它​​是完全透明的;如果为255(对于

uint8
),则它是完全不透明的;如果在它们之间,则它是部分透明的。因此,可以将此处最后使用的完全相同的蒙版堆叠到图像上,以创建第四个alpha通道(您可以使用
cv2.merge
numpy进行堆叠),从而使蒙版中的每个0像素完全透明;只需将图像另存为即可
png
。上面的代码创建具有alpha透明度的图像以及具有黑色背景的图像。

这里的背景看起来是白色的,因为它是透明的,但是如果将图像保存到系统中,则会看到它实际上是透明的。FYI
OpenCV实际上在

imshow()
此期间会忽略Alpha通道,因此您只会看到保存图像时的透明度。


编辑:最后一点…在这里,您的阈值去除了一些肺部。我已经添加了从肺部 内部
的阈值进入的孔,但是这错过了沿边界去除的一些块。如果您在遮罩上进行轮廓检测,那么如果重要的话,您实际上也可以将其平滑掉。在OpenCV的轮廓特征教程中查看“轮廓近似”部分。基本上,它将尝试使轮廓平滑,但会停留在距实际轮廓一定距离的范围内。这可能是有用的并且易于实现,所以我想把它作为建议放在最后。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5632507.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-15

发表评论

登录后才能评论

评论列表(0条)

保存