exponenta event banner

Идентификация объектов скругления

В этом примере показано, как классифицировать объекты по их округлости с помощью bwboundaries, подпрограмма трассировки границ.

Шаг 1: Чтение изображения

Чтение в pills_etc.png.

RGB = imread('pillsetc.png');
imshow(RGB)

Figure contains an axes. The axes contains an object of type image.

Шаг 2: Пороговое значение изображения

Преобразование изображения в черно-белое для подготовки к трассировке границ с помощью bwboundaries.

I = rgb2gray(RGB);
bw = imbinarize(I);
imshow(bw)

Figure contains an axes. The axes contains an object of type image.

Шаг 3: Удаление шума

Используя морфологические функции, удалите пиксели, которые не принадлежат интересующим объектам.

Удалите все объекты, содержащие менее 30 пикселей.

bw = bwareaopen(bw,30);
imshow(bw)

Figure contains an axes. The axes contains an object of type image.

Заполните пробел в колпачке пера.

se = strel('disk',2);
bw = imclose(bw,se);
imshow(bw)

Figure contains an axes. The axes contains an object of type image.

Заполните любые отверстия, чтобы можно было использовать области для оценки площади, окруженной каждой из границ

bw = imfill(bw,'holes');
imshow(bw)

Figure contains an axes. The axes contains an object of type image.

Шаг 4: Найти границы

Концентрируйтесь только на внешних границах. Опция «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

Figure contains an axes. The axes contains 7 objects of type image, line.

Шаг 5: Определение округлых объектов

Оцените площадь и периметр каждого объекта. Используйте эти результаты для формирования простой метрики, указывающей округлость объекта:

метрика = 4δ * ареапериметер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'])

Figure contains an axes. The axes with title Metrics closer to 1 indicate that the object is approximately round contains 15 objects of type image, line, text.

См. также

| | | | | | |

Связанные темы