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 objetos en función de su redondez mediante , una rutina de seguimiento de límites.bwboundaries

Paso 1: Leer imagen

Leer en .pills_etc.png

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

Paso 2: Umbral de la imagen

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

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

Paso 3: Retire el ruido

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

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

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

Llene un hueco en la tapa de la pluma.

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

Rellene los agujeros, de modo que los props de región se puedan utilizar 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 impidiendo la búsqueda de contornos interiores.bwboundaries

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

Muestre 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: Determinar 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 solo para un círculo y es menor que una para 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 sólo las píldoras se clasificarán como redondas.

Se utiliza para obtener estimaciones del área para todos los objetos.regionprops Observe que la matriz de etiquetas devuelta por puede ser reutilizada 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