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

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

Шаг 1: Readimage

Читайте в pills_etc.png.

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

Шаг 2: порог изображение

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

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

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

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

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

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

Заполните разрыв в прописной букве пера.

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

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

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

Шаг 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

Шаг 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'])

Смотрите также

| | | | | | |

Похожие темы