Modelos, Control y Sistema de Visión

Central     Modelos     Control     Visión     Aplicaciones     Mapa del sitio     Publicaciones     Sobre el autor      

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.