首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python和opencv:如何将此图像的所有背景转换为一种颜色或透明

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

Stack Overflow用户
提问于 2017-11-25 06:54:46
回答 1查看 8.2K关注 0票数 2

我在图像1上使用阈值掩码(图2)创建了以下图像(图3)。我试图使用opencv将图像3(肺)中央图像之外的所有像素转换为一种颜色(例如黑色)。基本上,这样我就只能在一个均匀的背景下(甚至是透明的)看到肺部的图像。我的问题是外部像素和图像3中肺内像素的相似性。这能用opencv吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-25 07:16:57

只需floodFill()的面具从边界的图像与黑色。请参阅我的答案这里中的洪水填充步骤,以查看它在另一个场景中的使用。

类似地,您可以使用floodFill()来查找哪些像素连接到图像的边缘,这意味着您可以使用它将肺中的空洞从阈值中放回。关于这个填洞过程的另一个例子,请看我的答案这里

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

代码语言:javascript
复制
import cv2
import numpy as np 

img = cv2.imread('img.jpg', 0)
mask = cv2.imread('mask.png', 0)

# flood fill to remove mask at borders of the image
h, 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 holes
holes = mask.copy()
cv2.floodFill(holes, None, (0, 0), 255)

# invert holes mask, bitwise or with mask to fill in holes
holes = cv2.bitwise_not(holes)
mask = cv2.bitwise_or(mask, holes)

# display masked image
masked_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通道,所以您只会看到保存图像的透明度。

编辑:最后一次note...here你的阈值已经移除了肺的一些部分。我在肺内的阈值中加入了一些洞,但这遗漏了一些被移除的边界上的块。如果你在面具上做轮廓检测,如果它很重要的话,你实际上也可以平滑一些。查看OpenCV的轮廓特征教程上的“等高线近似”一节。基本上,它将试图平滑轮廓,但坚持在一定的epsilon距离的实际轮廓。这可能很有用,而且很容易实现,所以我想我会把它作为一个建议放在这里。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47483411

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档