В этом примере показано, как классифицировать объекты по их округлости с помощью 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)
Заполните любые отверстия, чтобы можно было использовать области для оценки площади, окруженной каждой из границ
bw = imfill(bw,'holes');
imshow(bw)
Концентрируйтесь только на внешних границах. Опция «nooles» ускорит обработку, предотвращая 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

Оцените площадь и периметр каждого объекта. Используйте эти результаты для формирования простой метрики, указывающей округлость объекта:
ареапериметер2
Эта метрика равна 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