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

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

Шаг 1: Readimage

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

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

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

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

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

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

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

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

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

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

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

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

Заполните разрыв в дне пера.

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

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

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

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

Figure contains an axes object. The axes object 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 object. The axes object 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 object. The axes object with title Metrics Closer to 1 Indicate that the Object is Approximately Round contains 15 objects of type image, line, text.

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

| | | | | | |

Похожие темы