В этом примере показано, как классифицировать объекты на основе их округлости с помощью bwboundaries
, a контура трассировка стандартной программы.
Чтение в 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)
Концентрируйтесь только на внешних контурах. Опция '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