Этот пример показывает, как классифицировать объекты на основе их округлости с помощью 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