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.
En este ejemplo se muestra cómo clasificar objetos en función de su redondez mediante , una rutina de seguimiento de límites.bwboundaries
Leer en .pills_etc.png
RGB = imread('pillsetc.png'); imshow(RGB)
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)
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)
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
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:
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 .bwboundaries
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'])
bwareaopen
| bwboundaries
| imbinarize
| imclose
| imfill
| label2rgb
| regionprops
| strel