Esta página aún no se ha traducido para esta versión. Puede ver la versión más reciente de esta página en inglés.

Identificación de objetos redondos

En este ejemplo se muestra cómo clasificar los objetos en función de su redondez mediante una rutina de seguimiento de límites.bwboundaries

Paso 1: leer imagen

Lee.pills_etc.png

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

Paso 2: umbral de la imagen

Convierta la imagen a blanco y negro con el fin de prepararse para el rastreo de límites utilizando.bwboundaries

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

Paso 3: Quite el ruido

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

Quite todo el objeto que contenga menos de 30 píxeles.

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

Llene un hueco en el capuchón de la pluma.

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

Rellene los agujeros para que las regionprops puedan utilizarse para estimar el área delimitada por cada uno de los límites

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

Paso 4: encuentra los límites

Concéntrese solo en los límites exteriores. La opción ' noholes ' acelerará el procesamiento evitando la búsqueda de contornos internos.bwboundaries

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

Visualice la matriz de etiquetas y dibuje cada contorno.

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: Determine qué objetos son redondos

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

<math display="block">
<mrow>
<mi mathvariant="normal">metric</mi>
<mo>=</mo>
<mfrac>
<mrow>
<mn>4</mn>
<mi>π</mi>
<mo>*</mo>
<mi mathvariant="normal">area</mi>
</mrow>
<mrow>
<msup>
<mrow>
<mi mathvariant="normal">perimeter</mi>
</mrow>
<mrow>
<mn>2</mn>
</mrow>
</msup>
</mrow>
</mfrac>
</mrow>
</math>

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

Se utiliza para obtener estimaciones del área para todos los objetos.regionprops Tenga en cuenta que la matriz de etiquetas devuelta por se puede reutilizar por.bwboundariesregionprops

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

Consulte también

| | | | | | |

Temas relacionados