El funcionamiento será el siguiente :
Dividiremos la imagen a tratar en diferentes planos de intensidad; para cada uno de estos planos recorreremos la imagen e intentaremos aplicarles mascaras de diferentes tamaños (2x2, 3x3, ...) si todos y cada uno de los pixels de la mascara se encuentran es el intervalo de intensidades que abarca el plano analizada iremos incrementando el numero de piezas encajadas en ese plano. El valor del Coef. Morfológico en el plano que hemos analizado será la media del numero de piezas de diferentes tamaños que han encajado en él. Al recorrer todos lo planos de intensidades en los que dividimos inicialmente la imagen obtendremos un vector de CM’s.
Este método requiere los siguientes datos:
- Una imagen o un trozo de ella.
- El número de planos de colores a analizar.
- Limites divisorios de los distintos planos de colores.
- Tamaño y forma de la pieza a encajar.
El algoritmo obtiene como salida todos los valores del coeficiente morfológico para cada uno de los planos. El conjunto de esos valores forman un vector que representa la imagen analizada, el cual pasará a llamarse VECTOR CARACTERÍSTICO de esa imagen.
Para este proyecto utilizaremos los resultados de una imagen preprocesada mediante este algoritmo como paso previo a la clasificación de los patrones. Además y para facilitar dicha clasificación hemos realizado la normalización de estos vectores con vistas a su posterior uso.
El código de cálculo del CM que hemos utilizado habitualmente es el siguiente:
void CoeficienteMorfologico (int vent[],int numPlanos,int limPlanos[],int piezas[],float CM[])
{
unsigned pl, pi;
unsigned numPiezas;
short cabe;
unsigned totalPiezas[5];
unsigned X, Y, XFinal, YFinal, x, y;
short color;
int alto, ancho;
float vnorm;
video_get_size(&ancho,&alto);
vnorm=0.0;
numPiezas = 0;
for(pi=0;pi<5;pi++)
if(piezas[pi])
numPiezas++;
/* Para cada uno de los planos de la imagen */
for(pl=0;pl<numPlanos;pl++) {
/* Inicializamos el numero de piezas que caben de cada tamaño */
for(pi=0;pi<5;pi++)
totalPiezas[pi] = 0;
/* Para cada tamanyo de pieza elegido */
for(pi=0;pi<5;pi++) {
if(piezas[pi]){
/* Recorremos toda la ventana */
YFinal = vent[1] + vent[3];
XFinal = vent[0] + vent[2];
for(Y=vent[1];Y<YFinal;Y+=(pi+1)) {
for(X=vent[0];X<XFinal;X+=(pi+1)) {
/* Comprobar si cabe la pieza */
for(y=0;y<pi+1;y++) {
for(x=0;x<pi+1;x++) {
if((X+x)>=XFinal||(Y+y) >= YFinal)
color = -1;
else
color=video_get_pixel(X+x,Y+y);
cabe= (color>limPlanos[pl]) && (color<=limPlanos[pl+1]);
if(!cabe)
break;
}
if(!cabe)
break;
}
if(cabe)
totalPiezas[pi]++;
}
}
}
}
for(pi=1;pi<5;pi++)
totalPiezas[0] += totalPiezas[pi];
CM[pl] = (float)totalPiezas[0] / numPiezas;
vnorm += CM[pl]*CM[pl];
}
vnorm=sqrt(vnorm);
/*Normalizacion de valores entre 0 y 1*/
for(x=0; x<numPlanos; x++)
CM[x] = CM[x] / vnorm;
}