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

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

Шаг 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: Найти контуры

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

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

Шаг 5: Определите, какие объекты являются округлыми

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

metric=4π*areaperimeter2

Эта метрика равна 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.

См. также

| | | | | | |

Похожие темы