Gho*_*der 0 python opencv image
我使用图像1上的阈值掩模(图像2)创建了下面的图像(图像3).我试图将图像3(肺部)的中心图像之外的所有像素转换为一种颜色(例如黑色) OpenCV的.基本上这样我只剩下肺部的图像对着均匀的背景(甚至透明).我的问题是图像3上的外部像素与肺部内部像素的相似性.这是否可以使用opencv?
简单地floodFill()
从黑色图像边界的掩模.请参阅我的答案洪水填充步骤在这里看到它在另一个场景中使用.
同样,您可以使用它floodFill()
来查找哪些像素连接到图像的边缘,这意味着您可以使用它来从阈值处放回肺部的孔.请参阅我的答案,了解这个孔填充过程的不同示例.
我直接从上面的答案复制并粘贴代码,只修改变量名称:
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)
Run Code Online (Sandbox Code Playgroud)
编辑:另外,"透明度"基本上是一个掩码:值告诉你每个像素是多么不透明.如果像素为0,则它完全透明,如果它是255(for uint8
)那么它是完全不透明的,如果它在中间,那么它是部分透明的.所以在这里使用的完全相同的掩模可以堆叠在图像上以创建第四个alpha通道(你可以使用cv2.merge
或numpy来堆叠),它将使掩模中的每个0像素完全透明; 只需将图像保存png
为透明度即可.上面的代码创建了一个具有Alpha透明度的图像以及一个带有黑色背景的图像.
这里背景看起来是白色的,因为它是透明的,但是如果你将图像保存到你的系统,你会发现它实际上是透明的.仅供参考,OpenCV实际上会忽略alpha通道,imshow()
因此您只能看到保存图像时的透明度.
编辑:最后一个注意事项......在这里你的阈值已经消除了一些肺部.我已经加入了在肺部内发生的阈值处理的漏洞中,但这会错过沿着边界移除的一些块.如果你在掩模上进行轮廓检测,那么如果它很重要的话,你可以实际平滑一下.查看OpenCV 轮廓特征教程中的"轮廓近似"部分.基本上它会尝试平滑轮廓但是在实际轮廓的某个特定的epsilon距离内.这可能很有用并且易于实现,所以我想我最后会把它作为建议扔到这里.
归档时间: |
|
查看次数: |
3057 次 |
最近记录: |