如何仅在图像中留下最大的斑点?

时间:2019-06-13 23:26:45

标签: python opencv image-segmentation

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

这是一个示例图片:

brain mr

我尝试使用OpenCV并获得成功,但是失败了。我也完全不需要边框矩形框,我只想在图像中保留中心斑点,因为它在我提供的图像中看起来像是,并消除了周围的噪点/圆形。这可能吗?

2 个答案:

答案 0 :(得分:1)

我想,您想保留实际的大脑(“中间的斑点”)并去除头骨(“圆形的噪声形状”)。

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

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如下:

Output

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

希望有帮助!

答案 1 :(得分:0)

通过使用cv2.morphologyEx,我从二进制映像中丢失了很多细节。我正在使用以下代码仅保留图像的最大白色区域-

import skimage
from skimage import measure

labels_mask = measure.label(input_mask)                       
regions = measure.regionprops(labels_mask)
regions.sort(key=lambda x: x.area, reverse=True)
if len(regions) > 1:
    for rg in regions[1:]:
        labels_mask[rg.coords[:,0], rg.coords[:,1]] = 0
labels_mask[labels_mask!=0] = 1
mask = labels_mask

输入图片:

enter image description here

输出图像:

enter image description here