Main Content

Identificar objetos redondos

Este ejemplo muestra cómo clasificar objetos en función de su redondez empleando bwboundaries, una rutina de rastreo de límites.

Paso 1: Leer la imagen

Lea pills_etc.png.

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

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

Paso 2: Determinar el umbral de la imagen

Convierta la imagen a blanco y negro para preparar al rastreo de límites empleando bwboundaries.

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

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

Paso 3: Eliminar el ruido

Usando funciones morfológicas, elimine los píxeles que no pertenezcan a los objetos de interés.

Elimine los objetos que contengan menos de 30 píxeles.

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

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

Rellene el hueco de la tapa del bolígrafo.

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

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

Rellene los huecos, de forma que regionprops se pueda utilizar para calcular el área delimitada por cada uno de los límites

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

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

Paso 4: Encontrar los límites

Concéntrese únicamente en los límites exteriores. Especificar la opción 'noholes' acelerará el procesamiento impidiendo que bwboundaries busque contornos internos.

[B,L] = bwboundaries(bw,'noholes');

Muestre la matriz de etiquetas y dibuje cada límite.

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.

Paso 5: Determinar qué objetos son redondos

Calcule el área de cada objeto y su perímetro. Utilice estos resultados para formar una métrica simple que indique la redondez de un objeto:

metric=4π*areaperimeter2

Esta métrica es igual a 1 solo en el caso del círculo y será menos de 1 en el caso de cualquier otra forma. El proceso de discriminación se puede controlar estableciendo un umbral adecuado. En este ejemplo, utilice un umbral de 0.94 para que solo las píldoras se clasifiquen como redondas.

Utilice regionprops para obtener cálculos del área de todos los objetos. Tenga en cuenta que la matriz de etiquetas que devuelve bwboundaries la puede reutilizar 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.

Consulte también

| | | | | | |

Temas relacionados