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)
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)
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)
Rellene el hueco de la tapa del bolígrafo.
se = strel('disk',2);
bw = imclose(bw,se);
imshow(bw)
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)
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
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:
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'])
Consulte también
bwboundaries
| imbinarize
| bwareaopen
| imclose
| strel
| imfill
| label2rgb
| regionprops