首页 > 解决方案 > 如何只留下图像中最大的斑点?

问题描述

我有一个大脑的二进制图像。我只想将 blob 留在中心并去除周围呈圆形的“噪音”。

这是一个示例图像:

脑先生

我尝试使用 OpenCV 并获得计数,但失败得很惨。我也不需要一个边界矩形框,我只想将中心斑点留在图像中,就像它在我提供的图像中一样,并去除周围的噪音/圆圈。这可能吗?

标签: pythonopencvimage-segmentation

解决方案


我假设,你想保留实际的大脑(“中心的斑点”)并摆脱头骨(“噪音圆形”)。

不幸的是,您没有显示任何代码,所以我不确定您使用轮廓失败的原因,但这是我的建议:

import cv2
import numpy as np

# Read input
img = cv2.imread('images/t6igVVk.png', cv2.IMREAD_GRAYSCALE)

# Generate intermediate image; use morphological closing to keep parts of the brain together
inter = cv2.morphologyEx(img, cv2.MORPH_CLOSE, cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5)))

# Find largest contour in intermediate image
cnts, _ = cv2.findContours(inter, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
cnt = max(cnts, key=cv2.contourArea)

# Output
out = np.zeros(img.shape, np.uint8)
cv2.drawContours(out, [cnt], -1, 255, cv2.FILLED)
out = cv2.bitwise_and(img, out)

cv2.imshow('img', img)
cv2.imshow('inter', inter)
cv2.imshow('out', out)
cv2.waitKey(0)
cv2.destroyAllWindows()

最终输出out.png如下所示:

输出

我对输入图像进行了一些形态学闭合 ( morphologyEx, getStructuringElement) 以将大脑的实际部分保持在一起。在那个中间图像上,我寻找最大的轮廓。在我的findContours通话中,我使用该RETR_EXTERNAL模式仅获取所有“外部轮廓”。这意味着,当稍后绘制这个轮廓时,它也会被填充在中间(即侧脑室)。所以,最后我只是bitwise_and在两个图像上都使用 a 来解决这个问题。这也修复了中间图像中太大的部分。

希望有帮助!


推荐阅读