Как найти самый большой связанный регион, используя scipy.ndimage? - PullRequest
0 голосов
/ 02 декабря 2018

У меня есть двоичное изображение.Бинарное изображение имеет несколько изолированных областей, таких как шум.Я знаю, что ожидаемый регион намного больше, чем эти изолированные регионы.Следовательно, я использовал связанные компоненты, чтобы удалить изолированные области, найдя самую большую связанную область.Я должен использовать пакет Scipy.Я обнаружил, что для этого есть некоторые функции.Тем не менее, я все еще в далеком результате.Как я могу использовать функции для получения двоичного изображения, которое может игнорировать изолированную область?Спасибо

from scipy import ndimage
label_im, nb_labels = ndimage.label(binary_img)

# Find the largest connected component
sizes = ndimage.sum(binary_img, label_im, range(nb_labels + 1))
mask_size = sizes < 1000
remove_pixel = mask_size[label_im]
label_im[remove_pixel] = 0
labels = np.unique(label_im)
binary_img= np.searchsorted(labels, label_im)
#Select the biggest connected component
binary_img[binary_img < binary_img.max()]=0
binary_img[binary_img >= binary_img.max()]=1

1 Ответ

0 голосов
/ 02 декабря 2018

У вас хорошее начало, используйте ndimage.sum, чтобы найти размеры каждой помеченной области.

Оттуда вы можете использовать sizes (или что-то из него полученное) в качестве таблицы поиска:

from scipy import ndimage
label_im, nb_labels = ndimage.label(binary_img)
sizes = ndimage.sum(binary_img, label_im, range(nb_labels + 1))
mask = sizes > 1000
binary_img = mask[label_im]

Это создает таблицу поиска mask, которая равна true для индексов, которые соответствуют меткам для более крупных регионов, и false в других местах.Индексирование в справочную таблицу с использованием помеченного изображения дает желаемое двоичное изображение.

Обратите внимание, что sizes[label_im] - это изображение, в котором каждый регион окрашен в свой размер.То есть каждый пиксель в области # 1 получает значение размера области # 1.Вы можете создать пороговое значение для этого изображения, чтобы удалить небольшие области:

size_img = sizes[label_im]
binary_img = size_img > 1000

(Эти две строки эквивалентны двум последним строкам предыдущего фрагмента кода.)

...