Contar objetos en una imagen basado en grupos próximos Como se ha expuesto en aprendizaje no supervisado, se puede determinar de un grupo de datos cuáles son los significativos para determinada aplicación. Esta técnica puede utilizarse para determinar grupos significativos de píxeles en una imagen, discriminando objetos. De los algoritmos de clustering, existen algunos en que hay que definir a priori el número de clusters y en otros el radio que define la creación de un nuevo centro de grupo. Como se presupone que se desconoce el número de objetos que existen en una imagen, se utilizará el segundo método, en nuestro caso el método de grupos próximos a un entorno. Supóngase la siguiente imagen para demostrar la efectividad del método Se adquiere 1/4 de la imagen (programa) % Se lee la imagen I=imread('grupocir.jpg'); %Tamaño 400x400 píxeles % Se selecciona región II=I(1:200,1:200); Se conoce que esta sección de la imagen existen 16 objetos (grupos). A continuación se determinan cuáles son las coordenadas (x, y) de los píxeles blancos que identifican los objetos % Indices a unos [filas,columnas]=find (II==1); I2=[filas,columnas]; Posteriormente se determina un rango de variación del radio para creación de grupos, de forma tal que se puedan clasificar el número de objetos que se conocen (16 en nuestro caso) % Se selecciona intervalo de variación del radio radio_min=0.2; radio_max=0.22; radio_interv=0.0001; % Se determinan los radios que clasifican 16 grupos n_radios=1; for i=radio_min:radio_interv:radio_max [grupos]=subclust(I2, i); [a, b]=size(grupos) if a==16 %Número de grupos conocidos radio_val(n_radios, 1)=i; n_radios=n_radios+1; end end Los radios que cumplen la condición son % Radios que clasifican 16 grupos >> radio_val' Columns 1 through 8 0.2095 0.2096 0.2097 0.2098 0.2099 0.2100 0.2101 0.2102 Columns 9 through 16 0.2103 0.2104 0.2105 0.2106 0.2107 0.2108 0.2109 0.2110 Columns 17 through 24 0.2111 0.2112 0.2113 0.2114 0.2115 0.2116 0.2117 0.2118 De los radios que permiten clasificar los 16 grupos, se utilizara uno (el promedio) % Se obtiene el promedio de los radios que han clasificado 16 grupos radio=mean(radio_val); %En nuestro caso >> radio 0.2107 A continuación se comprueba que se clasifican, con el radio calculado, los 16 grupos % Calcula el número de clusters de la sección de imagen [filas2,columnas2]=find (II==1); I4=[filas2,columnas2]; [grupos2]=subclust(I4,radio); [numgrupos, b]=size(grupos2); %Número de grupos: numgrupos % Dibuja imshow(II); hold on plot(grupos2(:,1),grupos2(:,2),'*g') Nótese que, aunque la posición que identifica a los grupos no coincide con los centros, sí se ha determinado la cantidad correcta de objetos. Una vez determinado el radio, se aplica el mismo al algoritmo de grupos próximos, considerando que debe aplicarse un factor de ajuste (en nuestro caso radio/2, dependiente de la sección de imagen que se tome como prueba) que permita clasificar los 64 grupos de la imagen original, como se presenta a continuación % Calcula el número de clusters de la imagen original [filas2,columnas2]=find (I==1); I4=[filas2,columnas2]; [grupos2]=subclust(I4,radio/2); [numgrupos, b]=size(grupos2); %Número de grupos: numgrupos Que en nuestro caso devuelve 64, como era de esperar % Dibuja imshow(I); hold on plot(grupos2(:,1),grupos2(:,2),'*g') Aplicación: Programa para contar granos de arroz Sección de la imagen original (1/4): >> numgrupos=32 Imagen original: >> numgrupos=101 Comprobación Para comprobar la cantidad de granos, se utiliza el siguiente programa que determina centroides de objetos basado en conectividad I=imread('rice.png'); background = imopen(I,strel('disk',15)); % El fondo se obtiene de aplicación de apertura I2 = imsubtract(I,background); % Sustracción a la imagen el fondo I3=im2bw(I2,.2);
% Se aplica la erosión para separar posibles granos unidos ee=strel('square',3); I4=imerode(I3,ee);
% Se determinan los centroides L = bwlabel(I4); s = regionprops(L, 'centroid'); centroids = cat(1, s.Centroid); imshow(I4) hold on plot(centroids(:,1), centroids(:,2), 'b*') hold off |
El cual devuelve 100 granos de arroz, determinado por el número de filas >> size(centroids) ans = 100 2 El resultado con respecto a la aplicación de grupos próximos difiere en un grano de arroz. |