Modelos, Control y Sistema de Visión

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

Clasificación de textura en una imagen

 

La textura es un ente visual que describe cierto orden estructural o tendencia en los elementos presentes en una imagen. La figura que se muestra a continuación presenta cuatro tipos de textura y su histograma representativo

 

Para clasificar la textura se pueden utilizar las redes neuronales (son preferibles del tipo perceptrón multicapas por el elevado número de entradas propias de la clasificación de las imágenes), de forma tal que se identifique la tendencia en las tonalidades de grises presentes en la misma. Ello es, se define un área representativa en la imagen que mejor describa la textura que se pretende clasificar y se utiliza la información de los píxeles que la forman (y cierta región de interés) a la que se le asigna determinada clase que la distinga de otros tipos de textura, tal y como muestra la siguiente figura

 

 

Un programa en Matlab que realiza lo anteriormente descrito se muestra a continuación

% Obtiene matriz de región de la imagen

% Coordenadas matriciales

% Valor superior izquierdo inicial

xmin_gen=150;

ymin_gen=300;

% Valor inferior derecho final

xmax_gen=210;

ymax_gen=500;

 

% Region de interés de cada píxel [nxn]

n=17;

matriztot=zeros(1,n*n);

 

for x=xmin_gen:xmax_gen

for y=ymin_gen:ymax_gen

% Se invierte (coordenadas espaciales)

%I2 = imcrop(I, [xmin ymin width height])

I2 = imcrop(II,[y x n-1 n-1]);

% Convierte a filas una región

% Píxel central en matriz(:,(nxn+1)/2);

matriz=I2(1,:);

for i=2:n

matriz=[matriz I2(i,:)];

end

matriztot=[matriztot;matriz];

end

end

 

%Se suprime primera fila y devuelve la matriz

matriztot=matriztot(2:((xmax_gen-xmin_gen+1)*(ymax_gen-ymin_gen+1)+1),:);

 

Como la figura que se quiere clasificar presenta cuatro tipos de textura, se ejecuta el anterior programa en cuatro ocasiones (en cada región de interés representativa de la textura que se pretende identificar). Posteriormente se le asigna una clase a los datos obtenidos y se crea la matriz base para la identificación, como se muestra a continuación.

a1=ones(12261,1);
a2=zeros(12261,1);
textura1=[textura1 a1 a2 a2 a2];
textura2=[textura2 a2 a1 a2 a2];
textura3=[textura3 a2 a2 a1 a2];
textura4=[textura4 a2 a2 a2 a1];

 

% Matriz base para la identificación
texttot=[textura1; textura2; textura3; textura4];

 

A continuación se procede a identificar los datos obtenidos utilizando una red neuronal multicapas

% Se carga matriz representativa de imagen a identificar

load texttot;

 

% Se difenrencian entradas y salidas (target)

entradas=double(texttot(:,1:289))';

salidas=double(texttot(:,290:293))';

 

% Se define la red

num_capas=[25 13];

funcact={'tansig' 'tansig' 'purelin'};

net=newff(entradas,salidas, num_capas, funcact, 'traingdx', 'learngdm', 'mse');

net.trainParam.goal = 1e-3; % Error medio cuadrático deseado

net.trainParam.epochs = 5000; % Épocas

 

% Se entrena la red

train(net,entradas,salidas);

 

% Máximo valor 1 en cada columna

ynet=compet(sim(net,entradas));

 

Un método alternativo es utilizar la interfaz gráfica de usuario nftool, que fue la que se utilizó en este caso.

Una vez entrenada la red, se procede a aplicarla a la imagen donde se pretende identificar los distintos tipos de textura, tal y como se muestra en el siguiente programa

%Resultado sobre copia de imagen

III=II;

% Coordenadas metriciales de la imagen

% Valor superior izquierdo inicial

xmin_gen=40;

ymin_gen=40;

% Valor inferior derecho final

xmax_gen=200;

ymax_gen=490;

 

% Region de imagen que se obtendrá de cada píxel [nxn]

n=17; % 17x17

for x=xmin_gen:xmax_gen

for y=ymin_gen:ymax_gen

%Se invierten coordenadas (estas son espaciales)

I2 = imcrop(III,[y x n-1 n-1]);

% Convierte a filas una región

% Píxel central en matriz(:,(nxn+1)/2);

matriz=I2(1,:);

for i=2:n

matriz=[matriz I2(i,:)];

end

 

% Se aplica la red neuronal

ynet=compet(sim(net,double(matriz)'));

 

% Identifica la clase

[a, b]=find(ynet(:,1)==1);

 

% Se identifica tipo de textura

% Coordinadas matriciales

if (a==1)

III(x,y)=uint8(0);

else

if (a==2)

III(x,y)=uint8(90);

elseif (a==3)

III(x,y)=uint8(180);

else % (a==4)

III(x,y)=uint8(255);

end

end

end

end

 

A continuación se muestra la clasificación de la textura para diferentes tamaños de la región de interés alrededor del píxel

 

Región de interés del píxel: 9x9

Región de interés del píxel: 13x13

Región de interés del píxel: 17x17

 

Finalmente, si se aplica la mediana para suavizar la imagen y posteriormente se aplica el histograma, resulta

% Sólo región clasificada

IV=imcrop(III,[40 40 450 160]);

% Mediana

V=medfilt2(IV, [7, 7], 'symmetric');

% Histograma
[nk, rk]=imhist(V);
bar(rk, nk, 1);

imshow(IV) 

Región de interés del píxel: 13x13

Mediana

Histograma

 

Como se aprecia en la figura anterior , existen cuatro zonas del histograma (representativas de cada tipo de textura) claramente definidas. Nótese que existen tres aspectos fundamentales en este método de identificar texturas:

  1. Área representativa de la textura.
  2. Región de interés asociado a los píxeles.
  3. Obtención del mejor modelo posible en cada textura.