Подсчитайте количество замкнутых контуров в изображении — MATLAB

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

,

В идеале на этом изображении я хочу иметь функцию, которая считает четыре замкнутых контура.

Я не возражаю, если он также обнаружит действительно крошечные контуры между ними или всю форму как дополнительные контуры. Пока он считает средние, я могу исправить остальные, применив порог площади. Моя проблема в том, что любая функция, которую я пробовал, обнаруживает только один контур - всю форму, так как она не может разделить ее на su-conours, которые связаны друг с другом.

Какие-либо предложения?


person GUY TALMOR    schedule 12.04.2015    source источник
comment
возможный дубликат Подсчет количества BLOB-объектов с помощью MatLab   -  person knedlsepp    schedule 13.04.2015
comment
так что @GUY TALMOR ты посмотрел мой ответ?   -  person Benoit_11    schedule 16.04.2015


Ответы (1)


Вот мой пример, хотя ваш вопрос может быть закрыт, потому что он не по теме, слишком общий или возможный дубликат. Во всяком случае, я предлагаю другой способ подсчета количества контуров. Вы также можете сделать это, используя bwboundaries, как показано в ссылке, предоставленной @knedlsepp в возможном дубликате. Просто ради этого есть еще один способ.

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

Поскольку формы на вашем изображении выглядят как круг (вроде...), структурирующий элемент, используемый для закрытия изображения, представляет собой диск. Размер (здесь 5) зависит от вас, но для изображения, которое вы предоставили, это нормально. После этого используйте regionprops, чтобы найти области изображения (здесь капли) и подсчитать их, что, я думаю, возвращается к подсчету контуров. Вы можете указать параметр Area, чтобы отфильтровать фигуры по их площади. Здесь я прошу функцию предоставить центроиды для их построения.

Весь код:

clear
clc
close all

%// Read, threshold and clean up the image
Im = im2bw(imread('ImContour.png'));
Im = imclearborder(Im);

%// Apply disk structuring element to morphologically close the image.
%// Play around with the size to alter the output.
se = strel('disk',5);

Im_closed = imclose(Im,se);

%// Find centroids of circle-ish shapes. Youcan also get the area to filter
%// out those you don't want.
S = regionprops(~Im_closed,'Centroid','Area');

%// remove the outer border of the image (1st output of regioprops).
S(1) = [];

%// Make array with centroids and show them.
Centro = vertcat(S.Centroid);

imshow(Im)
hold on
scatter(Centro(:,1),Centro(:,2),40,'filled')

И вывод:

введите здесь описание изображения

Итак, как вы видите, алгоритм обнаружил 5 областей, но попробуйте немного поиграть с параметрами, и вы увидите, какие из них нужно изменить, чтобы получить желаемый результат из 4.

Повеселись!

person Benoit_11    schedule 12.04.2015
comment
Очень приятно мой друг. +1. - person rayryeng; 13.04.2015
comment
спасибо @rayryeng, я не был уверен, что это правильный подход, но я бы сделал именно так :) - person Benoit_11; 13.04.2015