Этот пример показывает, как классифицировать объекты на основе их округлости с помощью bwboundaries, стандартной программы трассировки контура.
Читайте в pills_etc.png.
RGB = imread('pillsetc.png');
imshow(RGB)
Преобразуйте изображение в черный цвет и белый цвет в порядке подготовиться к трассировке контура с помощью bwboundaries.
I = rgb2gray(RGB); bw = imbinarize(I); imshow(bw)

Используя функции морфологии, удалите пиксели, которые не принадлежат предметам интереса.
Удалите весь объект, содержащий меньше чем 30 пикселей.
bw = bwareaopen(bw,30); imshow(bw)

Заполните разрыв в прописной букве пера.
se = strel('disk',2);
bw = imclose(bw,se);
imshow(bw)
Заполните любые дыры, так, чтобы regionprops мог использоваться, чтобы оценить область, заключенную каждым из контуров
bw = imfill(bw,'holes');
imshow(bw)
Сконцентрируйтесь только на внешних контурах. Опция 'noholes' ускорит обработку, препятствуя тому, чтобы bwboundaries искал внутренние контуры.
[B,L] = bwboundaries(bw,'noholes');Отобразите матрицу метки и проведите каждую границу.
imshow(label2rgb(L,@jet,[.5 .5 .5])) hold on for k = 1:length(B) boundary = B{k}; plot(boundary(:,2),boundary(:,1),'w','LineWidth',2) end

Оцените область и периметр каждого объекта. Используйте эти результаты сформировать простую метрику, указывающую на округлость объекта:
Эта метрика равна 1 только для круга, и это - меньше чем один для любой другой формы. Процессом дискриминации можно управлять путем устанавливания соответствующего порога. В этом использовании в качестве примера порог 0,94 так, чтобы только таблетки были классифицированы как вокруг.
Используйте regionprops, чтобы получить оценки области для всех объектов. Заметьте, что матрица метки, возвращенная bwboundaries, может быть снова использована regionprops.
stats = regionprops(L,'Area','Centroid'); threshold = 0.94; % loop over the boundaries for k = 1:length(B) % obtain (X,Y) boundary coordinates corresponding to label 'k' boundary = B{k}; % compute a simple estimate of the object's perimeter delta_sq = diff(boundary).^2; perimeter = sum(sqrt(sum(delta_sq,2))); % obtain the area calculation corresponding to label 'k' area = stats(k).Area; % compute the roundness metric metric = 4*pi*area/perimeter^2; % display the results metric_string = sprintf('%2.2f',metric); % mark objects above the threshold with a black circle if metric > threshold centroid = stats(k).Centroid; plot(centroid(1),centroid(2),'ko'); end text(boundary(1,2)-35,boundary(1,1)+13,metric_string,'Color','y',... 'FontSize',14,'FontWeight','bold') end title(['Metrics closer to 1 indicate that ',... 'the object is approximately round'])

bwareaopen | bwboundaries | imbinarize | imclose | imfill | label2rgb | regionprops | strel