Вот мой пример, хотя ваш вопрос может быть закрыт, потому что он не по теме, слишком общий или возможный дубликат. Во всяком случае, я предлагаю другой способ подсчета количества контуров. Вы также можете сделать это, используя 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