Modelos, Control y Sistema de Visión

Central     Modelos     Control     Visión     Aplicaciones     Publicaciones     Mapa     Buzón     Sobre el autor      
Hardware     Imágenes     Transformaciones     Histograma     Filtros     Gradiente     Morfología      
Operaciones morfológicas y conectividad
 
Las operaciones morfológicas aplican un elemento estructural a la imagen de entrada, sin cambiar el tamaño de la imagen de salida. Las operaciones morfológicas más comunes son la dilatación y la erosión. En una operación morfológica, el valor de cada píxel en la imagen de salida depende del valor de ese píxel en la imagen de entrada y su relación con la vecindad. Seleccionando el tamaño y forma de la vecindad (definido a través de un elemento estructural) se puede crear una operación morfológica, que altera el valor del píxel en la imagen de salida.
 
Dilatación y erosión
La dilatación se basa en aumentar el nivel de los valores de los píxeles en el entorno de los objetos presentes en la imagen. La erosión se basa en reducir el nivel de los píxeles del entorno de un objeto. El número de píxeles a los que se aumenta o reduce el nivel depende del tamaño y forma del elemento estructural usado para procesar la imagen. La dilatación y la erosión expande y contrae la imagen.

Para calcular la dilatación se superpone el píxel central del elemento estructural a cada píxel de la imagen de entrada, entonces el píxel de la imagen de entrada se altera en función de los valores de los píxeles del entorno, definidos por el elemento estructural. El valor del píxel de salida será el máximo entre todos los píxeles presentes en la vecindad.
 
Un ejemplo de aplicación de un elemento estructural se muestra a continuación
 
 1 0 0
 0 0 0
 0 0 0

Imagen de entrada

 1 1 1
 1 1 1
 1 1 1

Elemento estructural

 1 0 0
 0 1 0
 0 0 0

Imagen de salida

 
Debido a que en el entorno definido por el elemento estructural cuadrado es de 3x3, el máximo valor es 1 en esa vecindad (en azul, parte superior izquierda de la primera matriz), entonces por este valor se sustituye el píxel central (en rojo, tercera matriz). Nótese que el anterior criterio puede utilizarse en imágenes definidas por escala de grises, como se muestra a continuación
 
 15 27 8
 100 95 1
 125 30 2

Imagen de entrada

 1 1 1
 1 1 1
 1 1 1

Elemento estructural

 15 27 8
 100 125 1
 125 30 2

Imagen de salida

 

Un programa en Matlab que desarrolla el anterior ejemplo es:
% Imagen de entrada
I=[0 0  0   0   0 0 0;
    0 0  0   0   0 0 0;
    0 0  15  27 8 0 0; 
    0 0 100 95 1 0 0;
    0 0 125 30 2 0 0;
    0 0  0   0   0 0 0;
    0 0  0   0   0 0 0];

% Elemento estructural
Ele=strel('square',3);
% Se aplica la dilatación
I1=imdilate(I, Ele);
% Matriz resultante
>> I1
I1 =
0  0     0    0    0 0 0
0 15   27   27  27 8 0
0 100 100 100 95 8 0
0 125 125 125 95 8 0
0 125 125 125 95 2 0
0 125 125 125 30 2 0
0   0    0    0    0 0 0

Los pixeles del contorno de la imagen son tratados de forma semejante a los filtros espaciales. En el caso de la dilatación, el valor de los píxeles de relleno se definen como el mínimo valor que admite el formato de dato para representar los píxeles de la imagen original, con lo que se garantiza que se sustituyan los píxeles del contorno con el máximo valor de la vecindad definida por el elemento estructural. Lo anterior se puede apreciar cuando se aplica la opción “full” a la función “imdilate”.

Como se ha expuesto previamente, el elemento estructural define la forma y el tamaño de la vecindad del píxel que será analizado, para posteriormente alterar su valor. Está definida por una matriz formada por ceros y unos de forma y tamaño arbitrario en la cual las posiciones donde está el uno define la vecindad. La matriz que define el elemento estructural tiene un tamaño muy inferior al tamaño de la matriz original que define la imagen a la que modificará.

Para determinar el origen del elemento estructural (que es equivalente al píxel que será modificado en la vecindad) se aplica la ecuación:


Centro = (tamaño+1)/2;

 

Por ejemplo, para el elemento estructural cuadrado de tamaño 3x3 el centro será:

Centro = (3+1 x 3+1)/2 = 2 x 2

 

tal y como se muestra en la siguiente figura


 

Si la matriz no es cuadrada, se redondea entonces hacia el entero más próximo hacia menos infinito.

 

A pesar de que el cuadrado de [3, 3] es el elemento estructural más generalmente usado, se pueden utilizar otros elementos estructurales, como los que se muestran a continuación

 

 >> ee=strel('diamond', 3)

0 0 0 1 0 0 0
0 0 1 1 1 0 0
0 1 1 1 1 1 0
1 1 1 1 1 1 1
0 1 1 1 1 1 0
0 0 1 1 1 0 0
0 0 0 1 0 0 0
>> ee=strel('disk', 4)

0 0 1 1 1 0 0
0 1 1 1 1 1 0
1 1 1 1 1 1 1
1 1 1 1 1 1 1
1 1 1 1 1 1 1
0 1 1 1 1 1 0
0 0 1 1 1 0 0

>> a=[0 1 0 1; 0 0 0 0;
          0 0 0 0; 1 0 1 0];

 


>> se=strel('arbitrary',a)
0 1 0 1
0 0 0 0
0 0 0 0
1 0 1 0

>> ee=strel('line', 7, 135)

1 0 0 0 0
0 1 0 0 0
0 0 1 0 0
0 0 0 1 0
0 0 0 0 1

 

>> ee=strel('octagon', 3)

0 0 1 1 1 0 0
0 1 1 1 1 1 0
1 1 1 1 1 1 1
1 1 1 1 1 1 1
1 1 1 1 1 1 1
0 1 1 1 1 1 0
0 0 1 1 1 0 0

>> ee=strel('rectangle', [4 3])

1 1 1
1 1 1
1 1 1
1 1 1
 

 

 

 

Los pasos para aplicar la dilatación son:

1.- Seleccionar el píxel de la imagen original a tratar.

2.- Buscar el mayor de los píxeles de la vecindad, incluído el central, definidos por la forma y tamaño del elemento estructural.

3.- Sustituir el valor del píxel por el máximo valor.

 

Los anteriores pasos se ejecutan para todos los píxeles de la imagen.

 

La erosión reduce el nivel de los píxeles del entorno de un objeto, para ello selecciona el mínimo valor de la vecindad del punto a tratar (en vez del máximo, como cuando se aplica la dilatación). Por ejemplo

 

 1 1 1
 1 1 1
 1 1 0

Imagen de entrada

 1 1 1
 1 1 1
 1 1 1

Elemento estructural

 1 1 1
 1 0 1
 1 1 0
Imagen de salida

 

Como se puede apreciar, se ha sustituído el píxel central por el mínimo valor de los píxeles de la imagen original definidos por la vecindad contenida en el elemento estructural. El programa que se muestra a continuación realiza la erosión de un grupo de píxeles

 % Imagen de entrada
I=[0 0  0   0   0 0 0;
    0 0  0   0   0 0 0;
    0 0  15  27 8 0 0; 
    0 0 100 95 1 0 0;
    0 0 125 30 2 0 0;
    0 0  0   0   0 0 0;
    0 0  0   0   0 0 0];

% Elemento estructural
Ele=strel('square',3);
% Se aplica la erosión
I2=imerode(I, Ele);
% Matriz resultante
>> I2
I2 =
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 1 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0

 

Nótese que todos los elementos de la matriz I tienen en una vecindad definida por el elemento estructurante cuadrado de tamaño 3x3 al menos un cero, excepto el elemento central (95), que ha sido sustituido por 1 (el menor valor del entorno).

 

Apertura y cerradura
Las operaciones de dilatación y erosión se combinan para formar diferentes métodos de procesar la imagen. Por ejemplo, uno de ellos es la apertura de una imagen, que es la realización de una erosión seguida de una dilatación utilizando el mismo elemento estructural en ambas operaciones. Este método se aplica cuando se desea eliminar los pequeños objetos y mantener el tamaño en los grandes (eliminar ruído). A continuación se muestra como realizar la apertura

% Se define el elemento estructural
ee=strel('diamond', 2);

% Se aplica la erosión
I1=imerode(I,ee);

% Seguida de la dilatación
I2=imdilate(I1,ee);

Lo anterior es equivalente a:
ee=strel('diamond', 2);
I2=imopen(I,ee);

 

La operación de cerradura de una imagen se realiza cuando se aplica la dilatación y posteriormente la erosión (contrario a la apertura). Este proceso se caracteriza por rellenar huecos y conectar objetos que están próximos entre sí. A continuación se muestra como realizar la cerradura

% Se define el elemento estructural
ee=strel('diamond', 3);

% Se aplica la dilatación
I1=imdilate(I,ee);

% Seguida de la erosión
I2=imerode(I1,ee);

Lo anterior es equivalente a:
ee=strel('diamond', 3);
I2=imclose(I,ee);

 

Transformada de ganancia o pérdida (Hit or Miss)
Es una herramienta que permite detectar determinadas formas en un grupo de píxeles de la imagen. Se define como la operación AND de una imagen (A), erosionada con un elemento estructural (B1) y el complemento de la imagen, erosionada con otro elemento estructural (B2), ello es:

 

 

La anterior expresión se puede interpretar como que esta transformación la constituyen el conjunto de puntos en los que coincide B1 en A y B2 en el complemento de A simultáneamente. Por ejemplo, para detectar el punto superior izquierdo de una imagen se pueden definir los siguientes elementos estructurales

>> b1=strel([0 0 0; 0 1 1; 0 1 0])
b1 =
0 0 0
0 1 1
0 1 0

>> b2=strel([1 1 1; 1 0 0; 1 0 0])
b2 =
1 1 1
1 0 0
1 0 0

Si la imagen a la que se pretende detectar la esquina superior izquierda se define por

 

a =
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 1 1 1 1 1 0 0
0 0 1 1 1 1 1 0 0
0 0 1 1 1 1 1 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 

 


Si se aplica la erosión utilizando b1, resulta:
>> c1=imerode(a, b1)

 

c1 =
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 1 1 1 1 0 0 0
0 0 1 1 1 1 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0

 

 

Cuando se aplica la erosión utilizando b2, resulta:
>> c2=imerode(imcomplement(a), b2)

 

c2 =
1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1
1 1 1 0 0 0 0 0 1
1 1 1 0 0 0 0 0 1
1 0 0 0 0 0 0 0 1
1 0 0 0 0 0 0 0 1
1 0 0 0 0 0 0 0 1
1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1

 

 

Si se interceptan ambas se obtiene el resultado final
>> c3=c1&c2

 

c3 =
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
 


Detectándose el píxel superior izquierdo.

 

Lo anterior es equivalente a:
>>c3=bwhitmiss(a, b1, b2); % Se aplica a imagen binaria

 

Basado en lo anterior se podría, por ejemplo, detectar los píxeles de todas las esquinas, rotando 90 grados los elementos estructurales tres veces y aplicando el OR entre las cuatro imágenes resultantes. Los elementos estructurales para detectar las cuatro esquinas se resumen en la siguiente tabla.

 

 0 0 0
 0 1 1
 0 1 0

b1

 0 0 0
 1 1 0
 0 1 0

b1

 0 1 0
 1 1 0
 0 0 0

b1

 0 1 0
 0 1 1
 0 0 0

b1

 1 1 1
 1 0 0
 1 0 0

b2

Superior

izquierdo

 1 1 1
 0 0 1
 0 0 1
b2
Superior
derecho
 00 1
 0 0 1
 1 1 1

 b2

Inferior

derecho

 10 0
 1 0 0
 1 1 1

 b2

Inferior

izquierdo


Este método puede aplicarse en la detección de otras formas, redefiniendo los elementos estructurales.

 

Vecindades de un píxel

Define la relación entre determinado píxel y su entorno. Existen tres tipos fundamentales de vecindad.

 

Vecindad horizontal y vertical (N4(p)): Definida a través de la siguiente relación entre píxeles

 

a=(x+1, y), b=(x-1, y), c=(x, y+1) y d=(x, y-1)

 

Vecindad diagonal (ND(p)): Definida a través de la siguiente relación entre píxeles

 

e=(x+1, y+1), f=(x+1, y-1), g=(x-1, y+1) y h=(x-1, y-1)

 

Vecindad ocho (N8(p)): Se representa a través de la unión de las dos vecindades anteriores, como se muestra a continuación

 

N8(p)=N4(p) U ND(p)

 

Conectividad

Simplifica la definición de otros conceptos como fronteras y regiones. Dos píxeles p y q están interconectados si cumplen los siguientes criterios:

a) Vecindad: q  pertenece a una vecindad de p (Ejemplo N8(p)).

b) Similitud: Los píxeles poseen niveles de gris (V) semejante. Ejemplo q=p=1 (imagen binaria).

 

Tipos de conectividad: Dos píxeles p y q pertenecen a V (nivel de gris semejante) si,

a) 4-conectados: q pertenece a N4(p).

b) 8-conectados: q pertenece a N8(p).

c) m-conectados: 1.- q pertenece a N4(p) ó, alternativamente

                         2.- q pertenece a ND(p) y la intersección de N4(p) y N4(q) no tienen píxeles que

                              pertenezcan a V.

 

Los píxeles m-conectados elimina la indeterminación en la relación entre píxeles que se produce en ocasiones cuando se aplica los píxeles 8-conectados, como se muestra en la siguiente relación de píxeles

 

                                                  Transparencias