Как оставить только самый большой шарик в изображении? - PullRequest
1 голос
/ 14 июня 2019

У меня есть двоичное изображение мозга.Я только хочу оставить шарик в центре и удалить окружающий «шум», который имеет форму круга.

Вот пример изображения:

brain mr

* 1007Я пытался использовать OpenCV и получать счетчики, но это с треском провалилось.Мне также не нужен ограничивающий прямоугольник, я просто хочу оставить центральный шарик на изображении, как он выглядит на предоставленном мною изображении, и удалить окружающий шум / круг.Возможно ли это?

1 Ответ

2 голосов
/ 14 июня 2019

Полагаю, вы хотите сохранить реальный мозг («капля в центре») и избавиться от черепа («шумовая круглая форма»).

К сожалению, вы не показывали никакого кода, поэтому я не уверен, что вам не удалось использовать контуры, но вот мое предложение:

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

Я делаю некоторое морфологическое закрытие (morphologyEx, getStructuringElement) на входном изображении, чтобы сохранить фактические части мозга вместе. На этом промежуточном изображении я ищу самый большой контур. В моем вызове findContours я использую режим RETR_EXTERNAL, чтобы получить только все "внешние контуры". Это означает, что при последующем рисовании этого контура он также будет заполнен посередине (то есть боковые желудочки). Итак, наконец, я просто использую bitwise_and на обоих изображениях, чтобы это исправить. Это также исправляет слишком большие части промежуточного изображения.

Надеюсь, это поможет!

...