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