Esta página es para la versión anterior. La página correspondiente en inglés se eliminó en la versión actual.

Identificar objetos redondos

En este ejemplo se muestra cómo clasificar los objetos basándose en su redondez mediante bwboundaries, una rutina de rastreo de límites.

Paso 1: Leer imagen

Leído en pills_etc.png.

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

Paso 2: Umbral de la imagen

Convierta la imagen en blanco y negro para prepararse para el rastreo de límites usando bwboundaries.

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

Paso 3: Eliminar el ruido

Utilizando funciones de morfología, elimine los píxeles que no pertenezcan a los objetos de interés.

% remove all object containing fewer than 30 pixels bw = bwareaopen(bw,30);  % fill a gap in the pen's cap se = strel('disk',2); bw = imclose(bw,se);  % fill any holes, so that regionprops can be used to estimate % the area enclosed by each of the boundaries bw = imfill(bw,'holes');  imshow(bw)

Paso 4: Encontrar los límites

Concentrarse sólo en los límites exteriores. La opción ' noholes ' acelerará el procesamiento evitando que bwboundaries busque contornos internos.

[B,L] = bwboundaries(bw,'noholes');  % Display the label matrix and draw each boundary 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

Paso 5: Determinar qué objetos son redondos

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

metric = 4*pi*area/perimeter^2.

Esta métrica es igual a una sólo para un círculo y es menor que una para cualquier otra forma. El proceso de discriminación puede controlarse estableciendo un umbral adecuado. En este ejemplo use un umbral de 0,94 para que sólo las píldoras se clasifiquen como redondas.

Utilice regionprops para obtener estimaciones del área para todos los objetos. Observe que la matriz de etiquetas devuelta por bwboundaries puede ser reutilizada por 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']);