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

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

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

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'])

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

| | | | | | |

Похожие темы