Tratamiento Digital de Imágenes Con IMtdi PDF
Tratamiento Digital de Imágenes Con IMtdi PDF
Tratamiento Digital de Imágenes Con IMtdi PDF
CON IMtdi
TRATAMIENTO DIGITAL DE IMÁGENES
CON IMtdi
ALMERÍA, 2001
1 Introducción..........................................................................................................9
2 Digitalización de imágenes.................................................................................11
3 Matrices ..............................................................................................................19
4 Imágenes .............................................................................................................45
5.1 Introducción........................................................................................................ 51
5.2 Mecanismos de aproximación al rango de colores............................................. 54
5.3 Métodos de procesamiento de puntos ................................................................ 57
5.4 Métodos de procesamiento de máscaras ............................................................ 85
6 Bibliografía....................................................................................................... 155
1 Introducción
F. GUINDOS
9
Tratamiento Digital de Imágenes con IMtdi
Distribución de IMtdi
Todo lo necesario para la utilización del entorno de trabajo IMtdi, ficheros de cabecera
(*.hpp) y librería (*.lib) se encuentra disponible en la dirección:
http://www.ual.es/~fguindos
10
2 Digitalización de imágenes
F. GUINDOS
Conocemos el mundo que nos rodea a través de los sentidos, entre los que la vista tiene un
papel fundamental. Gracias a ella obtenemos imágenes de nuestro entorno que suponen una
valiosa información para conocerlo.
Para poder utilizar un ordenador en la manipulación de imágenes, lo primero que hay que
hacer es dotarlo de un ojo y una forma de representación y almacenamiento de la imagen en su
interior.
Una cámara de televisión puede tomar imágenes pero, ¿cómo representarlas de una forma
manipulable por un ordenador digital? Surge así la necesidad de digitalizar las imágenes
obtenidas por las cámaras de visión. Lo mismo ocurre con las imágenes adquiridas mediante
cualquier otro sistema, como puede ser un escáner.
11
Tratamiento Digital de Imágenes con IMtdi
2.1 MUESTREO
En primer lugar es necesario discretizar el dominio espacial del la función de imagen f(x,y).
A la discretización (y limitación a un intervalo finito) de las coordenadas espaciales (x,y) se le
denomina muestreo.
El muestreo habitualmente se hace de forma que x e y tomen valores enteros, pero hay
algunas diferencias de unos sistemas a otros:
De esta forma, la función de imagen f(x,y) se convierte en una matriz, estructura fácilmente
manipulable por un sistema informático.
12
Digitalización de imágenes
Figura 2–3 La misma imagen con diferentes muestreos: 300×300, 100×100, 50×50 y 25×25
2.2 CUANTIZACIÓN
El siguiente paso es la digitalización de la amplitud de la función de imagen, lo que se
denomina cuantización. Para ello se ha de definir una forma de representación numérica
adecuada a la información visual aportada por cada píxel. Dos son los tipos de imágenes que se
pueden utilizar: de escala de grises o en color.
13
Tratamiento Digital de Imágenes con IMtdi
Figura 2–4 Una misma imagen con 4 cuantizaciones distintas: 256, 16, 4 y 2 niveles de gris respectivamente
Cuando la combinación de los colores básicos se hace de forma que al ojo llega la suma de
las componentes, nos encontramos con la composición aditiva y la base está formada por los
colores rojo, verde y azul (RGB). Los tres juntos forman el blanco. Esta es la situación es la que
se produce en las pantallas habitualmente utilizadas en los ordenadores.
Si la combinación de los colores básicos se hace de forma que cada componente absorbe
una parte de la luz blanca que llega hasta ellos, y sólo lo no absorbido llega al ojo del
observador, nos encontramos con la composición sustractiva, que es la que ocurre con las tintas
de las impresoras en color. La base para este tipo de combinación está formada por los colores
cian, magenta y amarillo (CMY).
14
Digitalización de imágenes
No son éstas las únicas bases posibles para definir el espacio del color. Aparte de éstas, y
entre las más usadas, se encuentra el modelo de color HSL, que se basa en valores de tono,
saturación y brillo. El tono es el color de base. La saturación es la pureza del color o la distancia
que lo separa del gris y el brillo es la cantidad de blanco que contiene.
Todos los modelos de color existentes se relacionan entre sí y hay fórmulas que nos
permiten pasar de uno a otro. Por ejemplo, entre RGB y CMY:
C = MAX – R
M = MAX – G
Y = MAX – B
Una vez escogido un espacio de color, una imagen se representará indicando el color para
cada uno de los píxeles. Para el almacenamiento, el modelo más utilizado es el RGB.
En las imágenes en color también se produce una cuantización, pues cada color se
representa con una cierta precisión. De nuevo, se suelen utilizar números naturales para ello y,
para adecuarlo al almacenamiento en el ordenador, lo más frecuente es utilizar un byte para cada
color de la base, lo que da un total de 3 bytes o 24 bits por píxel. El número de colores diferentes
con esta cuantización es de 23 × 8 = 16.777.215, muchos más de los que el ojo humano puede
distinguir, por lo que se denomina color real. También se utilizan cuantizaciones de 15 ó 16 bits
por píxel.
15
Tratamiento Digital de Imágenes con IMtdi
El tamaño necesario para almacenar una imagen depende directamente del muestreo y la
cuantización. En general, una imagen de M × N píxeles, cada uno de los cuales se representa con
b bits necesitará un espacio de M × N × b bits o, lo que es lo mismo, (M × N × b) / 8 bytes.
Sin embargo, el tamaño final de un archivo conteniendo una imagen puede variar de un
formato a otro, que se diferencian en varios factores.
2.3.1 Cabecera
Cuando se almacena una imagen, normalmente se guarda con ella información adicional,
como son el número de filas y columnas que contiene, cuantización utilizada, resolución a la que
fue tomada, etc. Estos datos conforman la cabecera de la imagen, que suele encontrarse al
principio del fichero.
No hay grandes diferencias de un formato a otro en cuanto a los datos que forman la
cabecera, pero sí en cuanto a la estructura, que es causa fundamental de incompatibilidades entre
ellos.
Una estrategia para reducir el tamaño es la utilización de una paleta de color. Los colores
disponibles para una imagen serán un subconjunto del espacio completo, normalmente escogidos
entre los más usados en dicha imagen. De esta forma, y siempre que se incluya la paleta en el
fichero de la imagen, para especificar el color de un píxel se indica el índice de la paleta donde
se encuentra ese color. Nos encontramos así con imágenes definidas en un espacio de color
amplio, pero del que sólo usan un número reducido de colores.
16
Digitalización de imágenes
IMAGEN PALETA
R G B
1
2 color
índice
3
4
5
6
Así, es frecuente encontrar imágenes con una paleta de 256 colores definida en un espacio
de 16 millones de colores (color real) que ocupan poco más de la tercera parte que el original.
2.3.3 Compresión
Otra posibilidad para reducir el tamaño ocupado por una imagen es la utilización de
técnicas de compresión en la propia especificación del formato de almacenamiento. En este
aspecto hay que diferenciar dos tipos de compresión.
17
3 Matrices
F. GUINDOS
Este módulo, implementado como una clase de C++ denominada C_Matrix permite definir
y manipular matrices de forma cómoda y segura. Con C_Matrix se pueden definir matrices de
números reales, acceder a sus elementos, obtener o modificar sus características, etc. También se
incluye una buena cantidad de funciones, algunas de ellas claramente orientadas al Tratamiento
Digital de Imágenes.
M M O M
a N ,1 aN ,2 L a N ,M
Figura 3–1 Representación matricial
3.1.1 Índices
Las filas y columnas de una matriz se numeran con índices. El modo habitual de hacerlo es
comenzando por la esquina superior izquierda y empezando por el número 1.
19
Tratamiento Digital de Imágenes con IMtdi
En C++, los índices de las matrices siempre comienzan por 0. La primera ventaja de clase
C_Matrix es que permite escoger al programador el comienzo y fin de la numeración, tanto para
filas como para columnas.
Otra ventaja que aporta esta clase en la manipulación de índices es la protección frente a un
error frecuente y desastroso cuando se programa en C++: los índices fuera de rango. Cuando esto
ocurre, los programas suelen quedarse “colgados”; a menudo, tiempo después de haberse
producido el fallo, lo que hace que sean difíciles de detectar. Con la clase C_Matrix, si se
produce alguno de estos accesos, se genera un mensaje de error inmediatamente y se impide
dicho acceso, por lo que el programador puede conocer fácilmente el punto donde falla el
programa, que no se colgará.
SUBMATRIZ
Una vez definida una submatriz, se pueden aplicar a ella todas las funciones definidas para
matrices (incluso crear una submatriz de la submatriz).
3.1.3 Vecindad
Algunas de los métodos definidos sobre las matrices utilizan en concepto de vecindad. Son
dos los tipos de vecindad utilizados en la retícula bidimensional definida por una matriz:
20
Matrices
4-vecindad y 8-vecindad. Los métodos cuyo funcionamiento depende del tipo de vecindad
utilizado admiten un parámetro en el que es especifica cuál de ellas ha de usar.
ElementT
El tipo ElementT es el que se utiliza interiormente en toda la clase para los elementos de la
matriz y se puede usar también para declarar datos independientes que hayan de ser del
mismo tipo. Se halla definido como real de doble precisión (double).
IndexT
Es el tipo utilizado en los índices de la matriz: inicio y fin de filas y columnas y variables
para acceso a sus elementos.
3.2.2 Constructores
Son varios los constructores de que dispone la clase. Todos ellos permiten crear un objeto
que pertenezca a ella.
C_Matrix
C_Matrix ( )
Crea una matriz vacía. Se usa para crear una matriz cuyo contenido vendrá dado por otra
función, por ejemplo, cuando se vaya a leer de un fichero.
21
Tratamiento Digital de Imágenes con IMtdi
Ejemplo
C_Matrix matriz;
C_Matrix
C_Matrix (const IndexT firstRow, const IndexT lastRow, const IndexT firstCol, const
IndexT lastCol, const ElementT initValue = 0)
Parámetros de entrada
Ejemplo
C_Matrix matriz (1, 5, 1, 5, 9);
Crea una matriz con filas y columnas de 1 a 5 y con un valor inicial en cada elemento
de 9.
1 2 3 4 5
1 9 9 9 9 9
2 9 9 9 9 9
3 9 9 9 9 9
4 9 9 9 9 9
5 9 9 9 9 9
Figura 3–4 C_Matrix matriz (1, 5, 1, 5, 9)
C_Matrix
C_Matrix (C_Matrix & superMatrix, const IndexT firstRow, const IndexT lastRow,
const IndexT firstCol, const IndexT lastCol, const IndexT firstRowSuperMat, const
IndexT firstColSuperMat)
22
Matrices
Crea una submatriz de una matriz creada previamente. Cuando se crea una matriz, los
índices de ésta no tienen necesariamente que coincidir con los equivalentes en la
supermatriz. Por ejemplo, para hacer una convolución, se puede definir una submatriz con
índices de –1 a +1, independientemente de donde se ubique en la supermatriz. Hay, por
tanto, que indicar sus índices inicial y final para filas y columnas y la posición donde se
ubica en la supermatriz (fila y columna de la esquina superior izquierda).
Parámetros de entrada
Ejemplo
Tras crear una matriz de 8 × 8, crea una submatriz de índices –1 a 1para filas y
columnas, ubicado con la esquina superior izquierda en la fila 2 y columna 4.
MATRIZ SUBMATRIZ
1 2 3 4 5 -1 0 1
1 -1
2 0
3 1
4
5
23
Tratamiento Digital de Imágenes con IMtdi
3.2.3 Destructores
Como cualquier objeto en C++, cuando una matriz ya no es necesaria, se puede destruir,
liberando así la memoria ocupada.
Es importante tener en cuenta que no se puede destruir una matriz de la que se encuentren
definidas submatrices. Si es necesario, primero se destruirán las submatrices y posteriormente la
supermatriz.
~C_Matrix
~C_Matrix ( )
Cuando se destruye una matriz, se libera tanto el espacio ocupado por sus elementos (el
cuerpo de la matriz) como por los datos que definen su estructura como objeto.
Free
Free ( )
Ejemplo
Empty
bool Empty ( )
Indica si una matriz está vacía. Es decir, si se ha creado con el constructor C_Matrix ( ) o
se trata de una matriz cuyo cuerpo se ha eliminado con Free ( ).
Ejemplo
C_Matrix matriz;
24
Matrices
. . .
if ( matriz.Empty() ) { printf("Matriz vacía\n"); }
FirstRow
IndexT FirstRow ( )
LastRow
IndexT LastRow ( )
FirstCol
IndexT FirstCol ( )
LastCol
IndexT LastCol ( )
RowN
IndexT RowN ( )
ColN
IndexT ColN ( )
Fail
bool Fail ( )
25
Tratamiento Digital de Imágenes con IMtdi
SetFail
SetFail ( )
Este método activa el indicador de fallo de una matriz. Útil cuando una operación sobre
ella ha fallado y, por tanto, los datos que contenga pueden no ser válidos. El valor de este
indicador de fallo se obtiene con el método Fail ( ).
Clear
Clear ( )
Cuando se activa el indicador de fallo en una matriz, permanece hasta que se desactive, lo
que se hace con este método.
26
Matrices
El método está protegido frente a accesos con índices fuera de la matriz. Si se accede a un
elemento inexistente, si es para lectura, devuelve un valor no definido y activa el indicador de
fallo de la matriz. Si ocurre al intentar modificar un elemento, simplemente se activa el indicador
de fallo. En ambos casos, el programa puede seguir funcionando normalmente. Es
responsabilidad del programador comprobar la condición de fallo y actuar en consecuencia.
Ejemplo
Operador =
El operador = se ha sobrecargado para poder realizar la asignación del valor de una matriz
a otra.
Ejemplo
Reindex
Cambia los índices de una matriz. Los datos contenidos se mantienen fijos respecto a la
matriz completa.
Ejemplo
C_Matrix matriz (0, 4, 0, 4);
. . .
matriz.Reindex(1, 1);
27
Tratamiento Digital de Imágenes con IMtdi
(0,0) 0 1 2 3 4 (1,1) 1 2 3 4 5
0 5 7 2 8 8 1 5 7 2 8 8
1 2 1 4 5 9 2 2 1 4 5 9
Reindex
2 0 2 3 6 4 3 0 2 3 6 4
3 3 1 0 9 3 4 3 1 0 9 3
4 4 6 2 1 7 5 4 6 2 1 7
Resize
Cambia el tamaño de una matriz, lo que supone una modificación en los índices. El valor
de cada elemento se mantiene fijo respecto a los índices (en aquellos que se conserven).
Permite especificar el valor que tendrán los elementos para los nuevos índices.
Ejemplo
0 1 2 3 4 1 2 3 4 5 6
0 5 7 2 8 8 1 1 4 5 9 0 0
1 2 1 4 5 9 2 2 3 6 4 0 0
Resize
2 0 2 3 6 4 3 1 0 9 3 0 0
3 3 1 0 9 3 4 6 2 1 7 0 0
4 4 6 2 1 7 5 0 0 0 0 0 0
6 0 0 0 0 0 0
ÍNDICES QUE
SE CONSERVAN
Figura 3–7 Resize: sólo se mantienen los datos para los índices que se conservan
MoveSubMat
Con este método podemos reubicar una matriz dentro de la supermatriz. Ningún elemento
se ve alterado por ello.
28
Matrices
Ejemplo
. . .
submatriz.MoveSubMat(2,3);
1 2 3 4 5
1 5 7 2 8 8
2 2 1 4 5 9
3 0 2 3 6 4
4 3 1 0 9 3
5 4 6 2 1 7
Min
ElementT Min ( )
Max
ElementT Max ( )
Sum
ElementT Sum ( )
29
Tratamiento Digital de Imágenes con IMtdi
Mean
ElementT Mean ( )
Mode
Parámetros de entrada
Parámetros de salida
Ejemplo
1 2 3 4 5
1 3 7 6 7 3
2 9 0 4 6 5
3 4 1 4 1 2
4 9 4 5 1 7
5 9 8 8 4 9
Figura 3–9 Matriz para aplicar los cálculos estadísticos
30
Matrices
Min = 0 Max = 9
Sum = 126 Mean = 5.04
Mode = 4 Frec = 5
Ejemplo
matriz.SetValue(9);
1 2 3 4 5
1 9 9 9 9 9
2 9 9 9 9 9
3 9 9 9 9 9
4 9 9 9 9 9
5 9 9 9 9 9
Figura 3–10 matriz.SetValue(9)
SetValue
Asigna el valor newValue a todos los elementos de la matriz cuyo valor sea oldValue.
Ejemplo
C_Matrix matriz (1, 5, 1, 5);
. . .
matriz.SetValue(0, 9);
31
Tratamiento Digital de Imágenes con IMtdi
1 2 3 4 5 1 2 3 4 5
1 1 0 1 1 0 1 1 9 1 1 9
2 0 1 0 1 0 2 9 1 9 1 9
3 0 1 0 1 1 3 9 1 9 1 1
4 1 0 1 1 1 4 1 9 1 1 1
5 0 0 1 1 1 5 9 9 1 1 1
Antes Después
Figura 3–11 Antes y después de ejecutar matriz.SetValue(0, 9)
SetValue
Asigna el valor newValue a todos los elementos de la matriz cuyo valor esté comprendido
entre oldValueMin y oldValueMax.
Ejemplo
. . .
matriz.SetValue(1, 5, 0);
1 2 3 4 5 1 2 3 4 5
1 7 6 6 6 2 1 7 6 6 6 0
2 4 3 9 2 1 2 0 0 9 0 0
3 1 5 2 7 7 3 0 0 0 7 7
4 9 7 5 3 5 4 9 7 0 0 0
5 5 9 1 6 2 5 0 9 0 6 0
Antes Después
Figura 3–12 Antes y después de ejecutar matriz.SetValue(1, 5, 0)
Serie
Serie (const ElementT initValue, const ElementT rowInc, const ElementT colInc)
32
Matrices
Parámetros de entrada
initValue Valor para el elemento en la primera fila, primera columna; a partir del
cual comenzará la serie.
Ejemplo
1 2 3 4 5
1 11 12 13 14 15
2 21 22 23 24 25
3 31 32 33 34 35
4 41 42 43 44 45
5 51 52 53 54 55
Figura 3–13 matriz.Serie (11, 10, 1)
Realiza un truncado de los valores de los elementos de la matriz. Cualquier valor por
debajo de min se cambia por min y los valores por encima de max se cambian por max.
Ejemplo
. . .
matriz.Trunc(10, 20);
33
Tratamiento Digital de Imágenes con IMtdi
1 2 3 4 5 1 2 3 4 5
1 9 27 19 26 3 1 10 20 19 20 10
2 1 5 2 12 9 2 10 10 10 12 10
3 30 1 4 7 1 3 20 10 10 10 10
4 15 17 12 2 1 4 15 17 12 10 10
5 22 18 20 20 11 5 20 18 20 20 11
Antes Después
Figura 3–14 Antes y después de ejecutar matriz.Trunc(10, 20)
Stretch
Ejemplo
. . .
matriz.Stretch(10, 20);
1 2 3 4 5 1 2 3 4 5
1 21 5 5 17 13 1 17.2 10.8 10.8 15.6 14
2 23 23 8 14 11 2 18 18 12 14.4 13.2
3 18 22 18 18 8 3 16 17.6 16 16 12
4 5 21 15 3 28 4 10.8 17.2 14.8 10 20
5 22 24 17 20 16 5 17.6 18.4 15.6 16.8 15.2
Antes Después
Figura 3–15 Antes y después de ejecutar matriz.Stretch(10, 20)
Abs ( )
34
Matrices
Ejemplo
. . .
matriz.Abs();
1 2 3 4 5 1 2 3 4 5
1 5 -5 2 -8 2 1 5 5 2 8 2
2 -2 -9 -4 5 -2 2 2 9 4 5 2
3 1 2 6 -5 0 3 1 2 6 5 0
4 6 -6 8 6 3 4 6 6 8 6 3
5 -9 3 8 1 7 5 9 3 8 1 7
Antes Después
Figura 3–16 Antes y después de ejecutar matriz.Abs ()
Add
Efectúa la suma matricial de mat1 + mat2 y almacena el resultado en la matriz para la que
se ejecuta el método.
Ejemplo
. . .
matriz3.Add(matriz1, matriz2);
1 2 3 4 5 1 2 3 4 5 1 2 3 4 5
1 1 7 7 5 8 1 10 4 6 8 5 1 11 11 13 13 13
2 1 10 2 3 7 2 10 4 8 7 3 2 11 14 10 10 10
3 6 7 9 8 8 3 10 4 4 2 6 3 16 11 13 10 14
4 3 9 2 8 2 4 9 4 9 10 2 4 12 13 11 18 4
5 5 4 4 3 7 5 2 5 8 4 1 5 7 9 12 7 8
matriz1 matriz2 matriz3
35
Tratamiento Digital de Imágenes con IMtdi
Subtract
Ejemplo
C_Matrix matriz1 (1, 5, 1, 5);
C_Matrix matriz2 (1, 5, 1, 5);
C_Matrix matriz3;
. . .
matriz3. Subtract(matriz1, matriz2);
1 2 3 4 5 1 2 3 4 5 1 2 3 4 5
1 6 2 7 9 4 1 4 2 10 5 6 1 2 0 -3 4 -2
2 3 4 7 6 7 2 8 5 2 5 1 2 -5 -1 5 1 6
3 9 6 3 10 7 3 9 3 6 1 5 3 0 3 -3 9 2
4 6 3 1 7 9 4 10 1 3 3 3 4 -4 2 -2 4 6
5 3 6 7 6 4 5 8 9 8 8 3 5 -5 -3 -1 -2 1
matriz1 matriz2 matriz3
MultiplyElm
Multiplica uno a uno cada elemento de mat1 por el correspondiente de mat2 y almacena el
resultado en la matriz para la que se ejecuta el método. No se trata de una multiplicación
matricial.
Ejemplo
. . .
matriz3. MultiplyElm(matriz1, matriz2);
36
Matrices
1 2 3 4 5 1 2 3 4 5 1 2 3 4 5
1 1 2 6 6 5 1 7 5 9 3 8 1 7 10 54 18 40
2 6 7 8 4 3 2 4 1 8 8 6 2 24 7 64 32 18
3 1 5 1 7 3 3 7 7 2 4 2 3 7 35 2 28 6
4 3 4 8 2 5 4 8 3 2 5 3 4 24 12 16 10 15
5 6 1 6 4 3 5 3 2 7 7 6 5 18 2 42 28 18
matriz1 matriz2 matriz3
DivideElm
Divide uno a uno cada elemento de mat1 por el correspondiente de mat2 y almacena el
resultado en la matriz para la que se ejecuta el método. No se trata de una división
matricial.
Ejemplo
. . .
matriz3.DivideElm(matriz1, matriz2);
1 2 3 4 5 1 2 3 4 5 1 2 3 4 5
1 3 9 2 1 10 1 10 9 9 6 10 1 0.3 1 0.2 0.2 1
2 7 3 4 7 8 2 2 1 7 6 5 2 3.5 3 0.6 1.2 1.6
3 8 9 4 7 6 3 7 8 3 1 2 3 1.1 1.1 1.3 7 3
4 7 5 1 5 3 4 1 9 3 7 5 4 7 0.6 0.3 0.7 0.6
5 4 9 6 5 7 5 9 10 6 3 3 5 0.4 0.9 1 1.7 2.3
matriz1 matriz2 matriz3
AddEscalar
37
Tratamiento Digital de Imágenes con IMtdi
Ejemplo
. . .
matriz.AddEscalar(10);
1 2 3 4 5 1 2 3 4 5
1 0 4 6 6 1 1 10 14 16 16 11
2 7 4 6 6 9 2 17 14 16 16 19
3 5 2 3 7 5 3 15 12 13 17 15
4 4 4 0 4 3 4 14 14 10 14 13
5 9 7 0 9 4 5 19 17 10 19 14
Antes Después
Figura 3–21 Antes y después de ejecutar matriz.AddEscalar()
SubtractEscalar
Ejemplo
C_Matrix matriz (1, 5, 1, 5);
. . .
matriz.SubtractEscalar(10);
1 2 3 4 5 1 2 3 4 5
1 10 12 13 19 13 1 0 2 3 9 3
2 15 15 16 13 19 2 5 5 6 3 9
3 14 18 10 14 19 3 4 8 0 4 9
4 18 18 19 14 12 4 8 8 9 4 2
5 10 14 13 12 19 5 0 4 3 2 9
Antes Después
Figura 3–22 Antes y después de ejecutar matriz.SubtractEscalar()
SubtractFromEscalar
38
Matrices
Ejemplo
. . .
matriz.SubtractFromEscalar(10);
1 2 3 4 5 1 2 3 4 5
1 7 7 6 9 6 1 3 3 4 1 4
2 1 1 3 6 1 2 9 9 7 4 9
3 10 4 7 1 7 3 0 6 3 9 3
4 8 7 5 3 8 4 2 3 5 7 2
5 7 7 6 3 3 5 3 3 4 7 7
Antes Después
Figura 3–23 Antes y después de ejecutar matriz.SubtractFromEscalar()
MultiplyEscalar
Ejemplo
. . .
matriz.MultiplyEscalar(10);
1 2 3 4 5 1 2 3 4 5
1 8 7 3 7 6 1 80 70 30 70 60
2 7 4 0 7 8 2 70 40 0 70 80
3 4 3 2 6 4 3 40 30 20 60 40
4 9 4 6 1 4 4 90 40 60 10 40
5 8 4 6 9 5 5 80 40 60 90 50
Antes Después
Figura 3–24 Antes y después de ejecutar matriz.MultiplyEscalar()
39
Tratamiento Digital de Imágenes con IMtdi
DivideEscalar
Ejemplo
. . .
matriz.DivideEscalar(10);
1 2 3 4 5 1 2 3 4 5
1 3 7 4 8 8 1 0.3 0.7 0.4 0.8 0.8
2 2 1 7 7 8 2 0.2 0.1 0.7 0.7 0.8
3 3 8 9 0 3 3 0.3 0.8 0.9 0 0.3
4 3 1 3 4 0 4 0.3 0.1 0.3 0.4 0
5 3 0 0 3 5 5 0.3 0 0 0.3 0.5
Antes Después
Figura 3–25 Antes y después de ejecutar matriz.DivideEscalar()
Gaussian
Da valores a los elementos de una matriz siguiendo una distribución gausiana. La matriz ha
de estar creada y dimensionada previamente. El resultado final se normaliza de forma que
la suma de todos los elementos sea 1.
Parámetros de entrada
Ejemplo
40
Matrices
matriz.Gaussian(0.5);
-2 -1 0 1 2
-2 0.0013 0.0085 0.016 0.0085 0.0013
-1 0.0085 0.057 0.11 0.057 0.0085
0 0.016 0.11 0.2 0.11 0.016
1 0.0085 0.057 0.11 0.057 0.0085
2 0.0013 0.0085 0.016 0.0085 0.0013
Figura 3–26 matriz.Gaussian(0.5);
Convolution
Parámetros de entrada
matrix Matriz original. No puede coincidir con aquella para la que se ejecuta el
método.
Ejemplo
. . .
matriz3.Convolution(matriz1, matriz2);
41
Tratamiento Digital de Imágenes con IMtdi
1 2 3 4 5 6 7 8 9 10 -1 0 1
1 6 3 10 3 6 9 2 3 5 8 -1 0.00033 0.017 0.00033
2 5 1 1 5 7 8 7 1 4 4 0 0.017 0.93 0.017
3 1 6 9 10 6 3 9 7 9 2 1 0.00033 0.017 0.00033
4 3 8 9 7 7 10 1 10 7 9 matriz2
5 5 6 10 4 10 9 9 3 1 10
6 1 9 3 7 5 9 10 6 3 3
7 1 5 7 7 2 8 5 7 7 10
8 6 3 4 8 6 5 5 1 5 4
9 10 8 1 10 5 1 3 4 10 4
10 6 6 7 4 10 5 9 1 5 10
matriz1
1 2 3 4 5 6 7 8 9 10
1 0 0 0 0 0 0 0 0 0 0
2 0 1.2 1.4 5 6.9 7.9 6.9 1.3 4.1 0
3 0 5.9 8.8 9.8 6.1 3.4 8.7 7 8.7 0
4 0 7.9 9 7 7.1 9.7 1.6 9.6 7 0
5 0 6.1 9.7 4.3 9.7 9 8.6 3.2 1.4 0
6 0 8.5 3.3 6.9 5.1 8.9 9.8 6 3.1 0
7 0 5 6.8 6.9 2.3 7.8 5.2 6.8 6.9 0
8 0 3.2 4.1 7.9 5.9 5 4.9 1.3 5 0
9 0 7.8 1.4 9.6 5.1 1.3 3.1 4 9.6 0
10 0 0 0 0 0 0 0 0 0 0
matriz3
Figura 3–27 matriz3.Convolution(matriz1, matriz2)
42
Matrices
Parámetros de entrada
Ejemplo
. . .
matriz.Print(3, 1);
1 2 3 4 5
--------------------
1| 4 3 9 2 0
2| 8 3 5 7 7
3| 0 5 5 2 0
4| 9 1 3 3 9
5| 4 4 0 2 4
Figura 3–28 matriz.Print(3, 1)
Write
Parámetros de entrada
Ejemplo
. . .
matriz.Write("Matriz.txt");
Read
Lee una matriz de un fichero de texto. La primera línea debe tener el número de filas y de
columnas.
Parámetros de entrada
43
Tratamiento Digital de Imágenes con IMtdi
Ejemplo
C_Matrix matriz;
. . .
matriz.Read("Matriz.txt");
44
4 Imágenes
F. GUINDOS
+ 3
4
5
La clase C_Image se ha definido como clase derivada de C_Matrix por lo que hereda todos
los métodos definidos para las matrices. Así, si aplicamos cualquier método de la clase C_Matrix
sobre una imagen, operará sobre la matriz principal de ésta. Además, se incluyen algunos datos
específicos de una imagen, como es la presencia de la paleta o los métodos de lectura y escritura
de formatos gráficos.
La paleta también es una matriz, pero para utilizar sobre ella los métodos definidos para
matrices, hay que hacer referencia explícita a ella.
45
Tratamiento Digital de Imágenes con IMtdi
C_RED
Columna de la paleta para la componente roja.
C_GREEN
Columna de la paleta para la componente verde.
C_BLUE
Columna de la paleta para la componente azul.
4.2.2 Datos
Además de aquellos datos heredados de la clase C_Matrix, en la clase C_Image se incluye:
Palette
Paleta de la imagen. Es una matriz de 3 columnas con índices (C_BLUE, C_GREEN y
C_RED) y tantas filas como colores, siendo su primer índice 0.
B G R
0
1
2
3
4
5
paletteSize - 1
Ejemplo
46
Imágenes
4.2.3 Constructores
Los constructores permiten crear un objeto de la clase. La clase C_Image dispone de varios
constructores.
C_Image
C_Image ( )
Se usa para crear una imagen cuyo contenido vendrá dado por otra función. Por ejemplo,
cuando se vaya a leer de un fichero.
C_Image
C_Image (const IndexT firstRow, const IndexT lastRow, const IndexT firstCol, const
IndexT lastCol, const ElementT initValue = 0, const IndexT paletteSize = 256)
Parámetros de entrada
initValue Valor inicial para cada píxel. Por omisión, se inicializarán con 0.
4.2.4 Destructores
Cuando un objeto C_Image ya no es necesario, se puede destruir, liberando así la memoria
utilizada. Se emplea para eso el destructor de la clase.
~C_Image
~C_Image ( )
47
Tratamiento Digital de Imágenes con IMtdi
Free
Free ( )
Libera el espacio ocupado por la imagen, incluyendo la paleta, pero conserva el objeto. No
es un destructor propiamente del lenguaje C++, pero se incluye porque en algunos casos
puede resultar adecuado liberar sólo el cuerpo de la imagen por motivos de ahorro de
memoria, pero mantener el objeto para usarlo posteriormente.
PaletteSize
IndexT PaletteSize ( )
SetPaletteSize
Grey ( )
Convierte una imagen en color en una imagen en tonos de grises con 256 niveles. Modifica
también la paleta de forma que albergue los 256 niveles de gris.
Lee una imagen de un fichero en formato BMP. Este fichero ha de tener una imagen sin
comprimir y almacenada con paleta.
48
Imágenes
Parámetros de entrada
WriteBMP
Parámetros de entrada
49
5 Preprocesamiento de Imágenes
J.A. PIEDRA
5.1 INTRODUCCIÓN
La fase del preprocesado está constituida por un conjunto de métodos que tienen la
finalidad de realzar en la forma aquellas características que nos interesan para una aplicación
concreta. La idea se basa en desechar todas aquellas características que no sean útiles para el
proceso al que pretendamos someter a nuestra forma, al tiempo que se deben conservar aquellas
que en alguna medida se consideren importantes.
Una definición más clara del preprocesado de una imagen es el procesamiento mediante un
conjunto de técnicas de mejora de manera que resulte más adecuada la imagen obtenida que la
original para un problema específico.
Se parte de una imagen original que es transformada en una o varias imágenes nuevas
mediante una secuencia de operaciones aplicadas a la imagen original. Estas transformaciones,
dependiendo de la imagen y del método o métodos que se apliquen, tendrán repercusión en
facilitar o no la etapa tanto de segmentación como de extracción de características.
Este capítulo se centra en el uso de métodos en el dominio espacial. Los métodos del
dominio espacial son los que actúan directamente sobre la imagen, es decir, la imagen por
definición existe en el dominio espacial, donde se hace referencia al conjunto de píxeles que la
componen. En contraposición, aparecen los métodos del dominio de las frecuencias que se basan
en la transformación de la imagen para modificar los datos que la componen desde el dominio
espacial a un nuevo dominio como es el de las frecuencias.
51
Tratamiento Digital de Imágenes con IMtdi
Filtro o
Dominio Dominio de la procedimiento a
espacial frecuencia aplicar
Transformación
-1
Filtro o
Dominio procedimiento a
Espacial aplicar
Se observa que la forma más rápida de cálculo es mediante filtros en el dominio espacial.
Por otra parte el dominio de la frecuencia no implica la obtención de una imagen mejor. Las
sucesivas transformaciones a través de procedimientos en un computador cuyo dominio de
trabajo es discreto y no real implica un acumulamiento del posible error que se este cometiendo.
Los métodos en el dominio espacial son procedimientos que operan directamente sobre los
píxeles de una imagen. Dichas funciones pueden expresarse como
52
Preprocesamiento de Imágenes
técnicas o mejoras basadas en este tipo de aproximación se conocen como procesamiento por
máscaras o filtrado.
Estas dos imágenes presentan características bien diferenciadas, en la primera los bordes
están más difuminados y presenta mucho ruido, mientras que en la segunda, los bordes se
53
Tratamiento Digital de Imágenes con IMtdi
encuentran bien diferenciados y el ruido es casi inapreciable. Estas diferencias van a permitir una
mejor comprensión acerca del funcionamiento de los distintos algoritmos.
Para controlar que el rango de los valores de la imagen no exceda los límites establecidos,
se ha optado por realizar unos procedimientos incluidos en la librería ‘TDI’ dentro de la clase
C_Matrix. Estos métodos permiten restringir un conjunto de valores de la matriz de la imagen y
trasladarlos al rango de valores de los colores en el que verdaderamente se mueve la imagen.
Estos procedimientos suelen ser muy útiles a la hora de visualizar los distintos resultados
que se han obtenido a través de distintos algoritmos de preprocesado o mejora de la imagen. De
esta manera, se consigue controlar el valor de los distintos elementos de la matriz de la imagen, a
la hora de ser almacenados en un archivo o mostrados por pantalla. Esto evita que se produzcan
errores por parámetros que se encuentren fuera del rango de colores de la imagen.
5.2.1 Truncamiento
El primero de ellos, consiste en truncar directamente el valor del resultado o la imagen
resultante en un intervalo definido. Gráficamente puede verse de la siguiente manera.
54
Preprocesamiento de Imágenes
Es decir, si el píxel excede los límites establecidos se aproxima por el máximo o mínimo
dependiendo en su defecto del que más se aproxime.
• Parámetros de entrada
min valor mínimo del rango de entrada.
max valor máximo del rango de entrada.
• Parámetros de salida
matriz de salida con los valores de los elementos dentro del rango de entrada.
Ejemplo
C_Image image,image2;
C_Matrix::IndexT rowN,colN,colorsN;
int isDark;
image2 = image;
C_Trace("Crimmins Speckel Removing ...");
image.CrimminsFilter(image2,isDark);
C_Image::BMPFileInfo(InFile,rowN,colN,colorsN);
C_Trace("Strech Image");
image.Trunc(0,(colorsN-1));
image.Free();
image2.Free();
55
Tratamiento Digital de Imágenes con IMtdi
5.2.2 Suavizado
El siguiente método es menos drástico que el anterior. Se basa en aplicar una función de
suavizado a los distintos valores de la imagen. De esta manera, se consigue reducir el error que
se obtiene al aplicar el truncamiento directamente, es decir, no hay un corte brusco en el rango de
valores sino que cada uno de estos se aproxima al intervalo. De manera grafica podría verse
como:
(Max − Min )
f ( x) = × x + min
(max − min )
Ecuación 5–3 Función de suavizado
donde Max y Min son los extremos del intervalo de colores definidos para la imagen, mientras
que max y min son los valores máximo y mínimo alcanzados en la imagen al aplicar sobre ella
una función de transformación.
56
Preprocesamiento de Imágenes
Calcula la matriz que hace referencia al método entre los valores de entrada.
Aplica una función de suavizado llevando cada uno de los elementos de la matriz
a un rango de entrada definido.
• Parámetros de entrada
minIn valor mínimo del rango de entrada.
maxIn valor máximo del rango de entrada.
• Parámetros de salida
matriz de salida con los valores de los elementos dentro del rango de entrada.
Ejemplo
C_Image image,image2;
C_Matrix::IndexT rowN,colN,colorsN;
int isDark;
image2 = image;
C_Trace("Crimmins Speckel Removing ...");
image.CrimminsFilter(image2,isDark);
C_Image::BMPFileInfo(InFile,rowN,colN,colorsN);
C_Trace("Strech Image");
image.Stretch(0,(colorsN-1));
image.Free();
image2.Free();
En este ejemplo actúa la función de suavizado sobre una imagen a la que se le ha aplicado
el filtro de Crimmins. El Min (mínimo de la paleta de la imagen) tomado para la función es 0 y el
Max (máximo de la paleta de la imagen) es el número de colores de la paleta – 1 para llevar a
cabo la sucesión de 0 a dicho color.
57
Tratamiento Digital de Imágenes con IMtdi
fotografías de una pantalla con película monocroma con la idea de emplear los negativos
resultantes como diapositivas normales.
La función inversa de una imagen se obtiene al aplicar un método sobre los niveles de gris
de la imagen. La función de transformación s = T(r) donde s va a ser el resultado de aplicar la
inversa modulo L al valor de r, y donde L es el número de niveles de gris. La idea es invertir el
orden de blanco a negro, de forma que la intensidad de la imagen de salida disminuya conforme
la intensidad de la imagen de entrada aumente. La función que aplica T sobre la imagen original
se denomina función inversa.
La gráfica siguiente sobre un histograma cualquiera puede darnos una idea de la forma de
la función.
• Parámetros de entrada
escalar del tipo ElementT definido.
58
Preprocesamiento de Imágenes
• Parámetros de salida
matriz de salida.
Ejemplo
C_Image image;
C_Trace ("Reading Image...");
image.ReadBMP (InFile);
C_IfError (image.Fail(), "Could not read the image file", return -1);
C_Matrix::IndexT rowN,colN,colorsN;
C_Image::BMPFileInfo(InFile,rowN,colN,colorsN);
image.Free();
En este ejemplo se muestra como se aplica la función inversa a una imagen para obtener el
negativo de la imagen. El valor escalar a restar es el número de colores de la imagen menos 1 ya
que la sucesión se inicia en 0. Para los resultados que se muestran a continuación el valor del
escalar es 256 –1.
Resultados
El resultado de aplicar este filtro a una imagen en niveles de gris, es la misma imagen
pero con los niveles de gris cambiados. Es decir, aquellos píxeles cuyo color original sea 0 en la
imagen de salida presentaran un valor 255, un píxel original con valor 1 presentara 254 en la
salida, y así con todos los píxeles de la imagen.
Estos son los resultados obtenidos para las dos imágenes originales:
59
Tratamiento Digital de Imágenes con IMtdi
Las imágenes resultantes obtenidas como se pueden comprobar son inversas a las
originales, es decir, en las zonas donde los colores son más claros aparecen colores más oscuros
y en las zonas donde los colores son más oscuros aparecen colores más claros. Esto es más
fácilmente apreciable en cada uno de los histogramas que se muestran, donde se observa que las
gráficas tanto del histograma de la imagen original como el de la imagen inversa si se unieran
serían simétricas, es decir, la forma de los histogramas se encuentra invertida de derecha a
izquierda.
60
Preprocesamiento de Imágenes
(s − min )
y = 1 × (x − min ) + min
(r1 − min )
Ecuación 5–4 Fórmula de la recta inicial
(s − s )
y = 2 1 × ( x − r1 ) + s1
(r2 − r1 )
Ecuación 5–5 Fórmula de la recta intermedia
61
Tratamiento Digital de Imágenes con IMtdi
(max − s 2 )
y = × (x − r2 ) + s 2
(max − r2 )
Ecuación 5–6 Fórmula de la recta final
El módulo recibe como parámetros los valores de los puntos (r1, s1) y (r2, s2) que definen el
rango de la imagen donde se va a producir el aumento de contraste. Recorre cada píxel para
ajustar ese rango a los valores contenidos en la imagen.
• Parámetros de entrada
r1 valor de la imagen original (nivel de gris).
s1 valor deseado de la imagen original (nivel de gris).
r2 valor de la imagen original (nivel de gris).
s2 valor deseado de la imagen original (nivel de gris).
min valor mínimo posible de la imagen original (se puede o no corresponder con
el valor mínimo alcanzado en la imagen).
max valor máximo posible de la imagen original (se puede o no corresponder con
el valor máximo alcanzado en la imagen).
• Parámetros de salida
matriz de salida.
Ejemplo
C_Matrix::ElementT r1=130,s1=130,r2=130,s2=130;
C_Image image;
C_Matrix::IndexT rowN,colN,colorsN;
62
Preprocesamiento de Imágenes
C_IfError (image.Fail(), "Could not read the image file", return -1);
C_Image::BMPFileInfo(InFile,rowN,colN,colorsN);
C_Trace("Calculating Contrast Image");
// r1=60 | s1=100 | r2=180 | s2=220 .
image.Contrast(r1,s1,r2,s2,0,(colorsN-1));
image.Free();
Resultados
La finalidad versa en poder llevar el rango de colores a los niveles deseados para trabajar
mejor con la imagen en cuestión. Se consigue a través de un análisis previo del histograma de la
propia imagen.
Para mostrar los resultados obtenidos vamos a utilizar el siguiente rango de valores: (r1, s1)
= (60, 100) y (r2, s2) = (180, 220) para aplicarlo sobre cada una de las distintas imágenes. Se han
obtenido las imágenes representadas en la siguiente figura:
Figura 5–14 Imagen con aumento de contraste ‘aviongr.bmp’ y su histograma. (r1=60, s1=100) - (r2=180, s2=220)
Para la Figura 5–14, el contraste aplicado permite esclarecer la imagen. Se puede observar
que realiza una especie de umbralizado pero suavizando el mismo, de esta manera queda
63
Tratamiento Digital de Imágenes con IMtdi
Figura 5–16 Imagen con aumento de contraste ‘payaso.bmp’ y su histograma. (r1=60, s1=100) - (r2=180, s2=220)
A partir de la Figura 5–16 anterior, al igual que sucedía con la Figura 5–14, podemos ver el
aumento de la luminosidad de la imagen como producto de unos parámetros de contraste alto,
provocan un esclarecimiento de la imagen original.
Suele ser útil cuando es necesario tomar imágenes donde el contraste de los objetos a priori
es muy similar y el nivel de luminosidad no es el adecuado. El aplicar el aumento de contraste
implica una mejor diferenciación de los distintos objetos que componen una imagen.
p(rk) = nk / n
Ecuación 5–7 Función del histograma
64
Preprocesamiento de Imágenes
donde rk es el k-ésimo nivel de gris, nk es el número de píxeles de la imagen con ese nivel de
gris, n es el número total de píxeles de la imagen y k = 0, 1, 2, ..., L-1.
La función del histograma p(rk) refleja el valor de la probabilidad en el nivel de gris rk. La
representación gráfica de esta función para todos los valores de k proporciona una descripción
global de la apariencia de una imagen. Por lo tanto, el histograma permite establecer si una
imagen tiene una apariencia oscura, si el rango dinámico de valores es estrecho, si una imagen
tiene un bajo o alto contraste, etc. El perfil del histograma de una imagen proporciona
información muy útil sobre la posibilidad de mejora de la imagen.
Si antes de visualizar la imagen original, tuviésemos que sacar conclusiones globales sobre
la imagen con tan solo el histograma de la imagen, podemos decir que la imagen presenta dos
rangos de colores que son los mas utilizados de los 256 colores en escala de gris. Un conjunto de
colores oscuros que corresponden al fondo de la imagen, es decir, las montañas que aparecen y
un conjunto de colores claros, casi blancos, que corresponden al avión contenido y al cielo en el
que vuela.
Sea r una variable que represente los niveles de gris de la imagen a mejorar. En la parte
inicial de la presentación se supondrá que los píxeles son cantidades continuas que han sido
normalizadas de forma que pertenezcan al intervalo [0, 1], con r = 0 representado el negro y r =
1 el blanco. Posteriormente consideraremos una formulación discreta y permitiremos que los
valores del píxel varíen en el intervalo [0, L - 1].
Para cada r del intervalo [0, 1], nos centramos en las transformaciones de la forma
s = T(r)
Ecuación 5–8 Operador de transformación
65
Tratamiento Digital de Imágenes con IMtdi
Que producen un nivel s para cada valor de píxel r de la imagen original. Se supone que el
valor de s verifica las condiciones:
b) 0 ≤ T(r) ≤ 1 para 0 ≤ r ≤ 1.
Para poder ser de aplicación en el procesado digital de imágenes, los conceptos que se
acaban de desarrollar han de expresarse en forma discreta. Para los niveles de gris que
constituyen los valores discretos, se tienen las probabilidades:
Pr(rk) = nk / n 0 ≤ rk ≤ 1 y k = 0, 1, ..., L – 1
Ecuación 5–9 Cálculo de probabilidades
rk = T-1(sk) 0 ≤ sk ≤1
Ecuación 5–11 Inversa de la ecualización del histograma
donde tanto T(rk) como T-1(sk) se supone que verifican las condiciones a) y b). La función de
transformación T(rk) puede calcularse directamente de la imagen a partir de las ecuaciones
anteriores. La función T-1(sk) no se emplea en ecualización de los histogramas.
El primer paso para obtener la ecualización del histograma de una imagen es calcular el
histograma de la imagen. Esta tarea se realiza mediante el siguiente procedimiento.
66
Preprocesamiento de Imágenes
• Parámetros de entrada
histogram matriz del histograma.
• Parámetros de salida
histogram matriz del histograma calculada.
El histograma para una imagen en niveles de gris es una matriz de [0, 255]. En cada
posición de la matriz se almacena el número de píxeles que presentan ese valor en la imagen. La
ecualización del histograma se realiza de la siguiente manera:
• Parámetros de entrada
hist matriz del histograma.
• Parámetros de salida
matriz de salida con la aplicación del histograma ecualizado.
Se trata de calcular el valor acumulado para una posición del histograma con
respecto a sus antecesores, es decir, la suma del valor contenido en la posición y
de cada uno de los valores contenidos en sus antecesores.
Ejemplo: Cálculo del valor acumulado para la posición 6 del histograma que
corresponde con el color nº 6 de la paleta.
67
Tratamiento Digital de Imágenes con IMtdi
10 12 25 30 5 40 80 30 ... 18 20 10
Cabe destacar que los niveles de gris de una imagen que ha sido sometida a la
ecualización del histograma están repartidos y siempre alcanzan el blanco. Este proceso
incrementa el rango dinámico de niveles de gris y, en consecuencia, produce un aumento en el
contraste de la imagen. Para presentar el resultado obtenido en la ecualización presentaremos la
imagen original junto con su histograma y la imagen resultante de la ecualización junto con su
histograma.
Ejemplo
C_Image image;
C_Matrix::IndexT rowN,colN,colorsN;
C_Image::BMPFileInfo(InFile,rowN,colN,colorsN);
C_Matrix histogram(1,1,0,(colorsN-1),0);
C_Trace ("Calculating Histogram..");
image.CalculateHistogram(histogram);
68
Preprocesamiento de Imágenes
En este ejemplo se muestra el cálculo del histograma, así como la ecualización del
histograma para una imagen dada.
Resultados
En las imágenes anteriores podemos ver como los niveles de gris utilizados en la imagen se
distribuyen de manera uniforme. La mejora respecto a la imagen original resulta evidente.
69
Tratamiento Digital de Imágenes con IMtdi
En esta segunda imagen podemos apreciar mejor como la ecualización del histograma
presenta una distribución de los niveles de píxeles de una imagen entre el rango de valores de
niveles de gris. En la primera de las imágenes los niveles de gris utilizados estaban distribuidos
sobre todo el rango de valores. En esta segunda imagen el rango de valores utilizados estaba más
concentrado. La ecualización del histograma produce una dispersión de los niveles de gris
llegando a utilizar los 256 colores.
70
Preprocesamiento de Imágenes
resultado, la imagen debe ser escalada de tal forma que el valor máximo tiene que ser 255. la
imagen resultante viene dada por la siguiente función:
Q(i, j ) = cb P ( i , j )
Ecuación 5–12 Función exponencial
(
Q(i, j ) = c b P ( i , j ) − 1 )
Ecuación 5–13 Función exponencial mejorada
Podemos ver en la figura que la curvatura de la función exponencial en base 10 esta muy
cercano a incrementar la visión de una imagen normal. Podemos controlar la curvatura de la
función escogiendo valores apropiados para los valores base.
71
Tratamiento Digital de Imágenes con IMtdi
• Parámetros de entrada
b base de la exponencial.
min nivel mínimo de gris que puede alcanzar la imagen (el color más bajo para
los niveles de gris es el 0).
max nivel máximo de gris que puede alcanzar la imagen (el color más alto para
los niveles de gris es el 255).
• Parámetros de salida
matriz de salida con la aplicación de la exponencial.
Ejemplo
C_Matrix::ElementT c,b;
C_Matrix::IndexT rowN,colN,colorsN;
C_Image image;
C_Image::BMPFileInfo(InFile,rowN,colN,colorsN);
72
Preprocesamiento de Imágenes
image.Free();
Resultados
Los resultados obtenidos para cada una de las imágenes son los que se muestran a
continuación.
73
Tratamiento Digital de Imágenes con IMtdi
Se observa, a medida que se incrementa la base se oscurece más la imagen, esto se debe no
solo a la función exponencial sino al efecto que causa la función de suavizado sobre la imagen
obtenida llevando los valores muy próximos al mínimo. El histograma obtenido bajo estos
factores es inverso al de la función exponencial.
En ambos resultados de las imágenes se observa como a medida que se incrementa el valor
de b el histograma se aproxima más a la función exponencial. De esta manera se contempla un
74
Preprocesamiento de Imágenes
oscurecimiento parcial de la imagen. El filtro exponencial oscurece las imágenes dándole más
prioridad a los niveles de gris más bajos. En nuestro ejemplo hemos utilizado b = 2 y b = 100,
donde valores más altos de b producirían un incremento de la intensidad de los niveles de gris
más bajos de la imagen original.
El valor de la constante c se elige de tal forma que el valor máximo de la salida sea 255.
Eso ocurre si R es el valor con una magnitud máxima en una imagen de entrada, c viene dado
por
255
c=
log(1 + R )
Ecuación 5–16 Obtención de la constante c
75
Tratamiento Digital de Imágenes con IMtdi
pequeña para una imagen que contiene valores pequeños. La función de muestreo se representa
para dos diferentes rangos de entrada en la siguiente figura:
• Parámetros de entrada
min mínimo posible a tomar por la imagen.
max máximo posible a tomar por la imagen.
• Parámetros de salida
matriz de la imagen de salida con el logaritmo aplicado.
Ejemplo
C_Image image;
C_Matrix::IndexT rowN,colN,colorsN;
C_Image::BMPFileInfo(InFile,rowN,colN,colorsN);
76
Preprocesamiento de Imágenes
image.Free();
Resultados
Los resultados obtenidos para las distintas imágenes son los siguientes:
77
Tratamiento Digital de Imágenes con IMtdi
Se observa que para los resultados obtenidos el logaritmo incrementa la intensidad en los
colores más claros de la imagen. Atendiendo a la gráfica que muestra el histograma para cada
una de las imágenes, se ve perfectamente el aumento de los niveles de gris más claros.
B = k (V^gamma)
Ecuación 5–17 Función gamma
siendo B la luz, V la tensión '^' signo de potencia y gamma un factor de descompensación y que
produce esta no linealidad. Algunos valores típicos de gamma según el tubo de rayos catódicos
son 1.7, 2.8 y también los hay de valor 1 que no producen esta alteración.
La corrección gamma lo que hace es elevar la señal al exponente 1/gamma para compensar
el efecto comentado anteriormente.
Existen otros muchos efectos de este tipo y otros muchos pueden ser inventados, sobre
todo si no se busca una utilidad práctica de los mismos sino únicamente una utilidad estética, así
que se trata de un interesante campo de experimentación. La forma más fácil de jugar con nuevos
efectos es aplicando diferentes funciones de transferencia a las imágenes.
El uso de la función gamma permite en muchos casos reducir las imperfecciones de las
imágenes como consecuencia de la imperfección de los dispositivos ópticos. Por ello, puede ser
78
Preprocesamiento de Imágenes
usada como filtro para suavizar imágenes dependiendo del valor de entrada que se le asigne a la
constante.
• Parámetros de entrada
g coeficiente de la función gamma.
min mínimo posible a tomar por la imagen.
max máximo posible a tomar por la imagen.
• Parámetros de salida
matriz de la imagen de salida con la función gamma aplicada.
Ejemplo
C_Image image;
C_Matrix::ElementT g=1;
79
Tratamiento Digital de Imágenes con IMtdi
C_Matrix::IndexT rowN,colN,colorsN;
C_Image::BMPFileInfo(InFile,rowN,colN,colorsN);
image.Free();
Resultados
Los resultados obtenidos son los que se muestran a continuación:
80
Preprocesamiento de Imágenes
81
Tratamiento Digital de Imágenes con IMtdi
1
Si a < x < b
f ( x ) = (b − a )
0 En el resto
La función uniforme aplicada a una imagen permite darle una especie de suavizado.
• Parámetros de entrada
min mínimo posible a tomar por la imagen.
max máximo posible a tomar por la imagen.
82
Preprocesamiento de Imágenes
• Parámetros de salida
matriz de la imagen de salida con la función gamma aplicada.
El operador de la función uniforme permite suavizar la imagen de acuerdo con los valores
máximos y mínimos alcanzados en ella. De esta manera si la imagen es muy oscura con
pequeñas regiones claras estas zonas tenderán a oscurecer, para el caso contrario se producirá el
efecto inverso.
Ejemplo
C_Image image;
C_Matrix::IndexT rowN,colN,colorsN;
C_Image::BMPFileInfo(InFile,rowN,colN,colorsN);
image.Free();
Resultados
Los resultados obtenidos para las distintas imágenes son los siguientes:
83
Tratamiento Digital de Imágenes con IMtdi
Para cada uno de los dos ejemplos se produce una leve modificación, simplemente en
algunos picos muy altos del histograma se modifica un poco. Esto también es debido a que la
constante de multiplicación es muy pequeña lo que produce una diferenciación menor.
84
Preprocesamiento de Imágenes
Una matriz de convolución es una tabla que cumple la restricción de que su tamaño debe
ser 2n + 1, donde n = 1, 2, 3,... A continuación se explica la manera de realizar los cálculos para
una matriz de convolución de tamaño 3 × 3.
w1 w2 w3
w4 w5 w6
w7 w8 w9
Tabla 5–1 Matriz de convolución
z1 z2 z3 z4 z5 z6
z19 z 20 z 21 z 22 z 23 z 24
z 25 z 26 z 27 z 28 z 29 z 30
z 31 z 32 z 33 z 34 z 35 z 36
Tabla 5–2 Matriz de una imagen en niveles de gris
85
Tratamiento Digital de Imágenes con IMtdi
Para resolver el problema planteado hay que determinar primero cuales son las regiones o
zonas conflictivas a resolver. Mostrar como se resolvería para el caso de una matriz de
convolución de dimensiones 3 × 3 y posteriormente generalizarlo para matrices de convolución
de tamaño N × N, teniendo en cuenta la restricción comentada al principio del apartado.
Las regiones problemáticas de una imagen a la hora de aplicar una matriz de convolución
son las que se muestran en la siguiente figura.
1 5 2
7 9 8
3 6 4
Región 9: centro.
86
Preprocesamiento de Imágenes
Estas regiones, salvo la número 9 cuyo cálculo ha sido descrito, presentan una serie de
problemas y criterios a tener en cuenta. A continuación, se va a describir como se resuelve para
cada región en función de una matriz de convolución de tamaño 3 × 3 y como se realizaría para
tamaños más grandes.
En este caso los píxeles en negro corresponden a valores de la imagen y los píxeles en
blanco a puntos fuera de la imagen y que no contienen valor. El procedimiento se basa en asignar
un valor a los píxeles en blanco siguiendo algún criterio. La forma de asignación se efectúa de
manera que un píxel del borde de la imagen siempre va a asignar un valor a su adyacente en
blanco. Para una matriz de convolución de mayor tamaño se daría el caso de que la asignación
no sería a un elemento adyacente en blanco sino que podría haber más de uno al que asignar el
valor. En este caso, se copiaría el valor de los elementos de la misma dirección en la que
establecen las flechas con la salvedad que habrá más elementos a copiar.
Otra posible solución sería copiar los valores de regiones opuestas, es decir, contemplar
que las imágenes son circulares. Esto se deduce del dominio de frecuencias, donde una vez que
la función de la imagen se encuentra en el dominio de las frecuencias, esta es considerada
periódica. Este concepto de periodicidad es el que da sentido a la solución propuesta. El
problema es que en la realidad las imágenes no son periódicas y no tienen por que coincidir
regiones opuestas. Esto expresa que no sería la solución más idónea.
87
Tratamiento Digital de Imágenes con IMtdi
• Parámetros de entrada
matrix matriz de la imagen de entrada.
conMatrix matriz de convolución.
• Parámetros de salida
matriz de la imagen de salida con la aplicación de la convolución.
Ejemplo
int c=1;
C_Image image,image2;
C_Matrix conv;
C_Trace("Reading Convolution...");
conv.Read(ConvFile);
image2 = image;
C_Trace("Filtering Convolution...");
image.CalculateConvolution(image2,conv);
C_Matrix::IndexT rowN,colN,colorsN;
C_Image::BMPFileInfo(InFile,rowN,colN,colorsN);
C_Trace("Strech Image");
image.Stretch(0,(colorsN-1));
conv.Free();
image.Free();
image2.Free();
Para los módulos que extraen submatrices de las esquinas el comportamiento de manera
genérica puede enfocarse de la siguiente manera:
88
Preprocesamiento de Imágenes
• Copiar la imagen. Se basa en copiar las posiciones de los píxeles que coincidan sobre
la matriz de la imagen en la matriz de convolución.
• Copiar ambos laterales. Se centra en copiar los píxeles con contenido en los
adyacentes sin contenido mediante los dibujos establecidos en la Figura 5–49.
Por otra parte, los módulos que extraen submatrices de los laterales el comportamiento
general que puede extraerse de ellos es el siguiente:
• Copiar la imagen. Se basa en copiar las posiciones de los píxeles que coincidan sobre
la matriz de la imagen en la matriz de convolución.
• Copiar lateral. Se centra en copiar los píxeles con contenido en los adyacentes sin
contenido mediante los dibujos establecidos en la Figura 5–49.
Llegando a este punto en el tratamiento del centro de la matriz vamos a disponer del
resultado obtenido al aplicar la matriz de convolución según el tamaño. De este modo podemos
aplicar cualquier filtro de convolución simplemente leyendo la matriz de datos del archivo que la
almacena, asignar dichos datos a una matriz de convolución y aplicar la convolución a la matriz
de la imagen para obtener el resultado de la aplicación de diversos filtros.
89
Tratamiento Digital de Imágenes con IMtdi
• Parámetros de entrada
matrix matriz de entrada.
Gx matriz de convolución.
Gy matriz de convolución.
• Parámetros de salida
matriz de salida con la convolución calculada para las dos matrices.
Ejemplo
int c=1;
C_Image image,image2;
C_Matrix Gx,Gy;
image2 = image;
C_Trace("Filtering Two Matrix of Convolution ...");
image.CalculateConvolution2(image2,Gx,Gy);
C_Matrix::IndexT rowN,colN,colorsN;
C_Image::BMPFileInfo(InFile,rowN,colN,colorsN);
C_Trace("Strech Image");
image.Stretch(0,(colorsN-1));
Gx.Free();
Gy.Free();
image.Free();
image2.Free();
90
Preprocesamiento de Imágenes
habilitan las diferentes direcciones. Por lo que se ha creído conveniente desarrollar otro módulo
que se muestra a continuación.
• Parámetros de entrada
matrix matriz de entrada.
Gx matriz de convolución.
Gy matriz de convolución.
Gdp matriz de convolución.
Gds matriz de convolución.
• Parámetros de salida
matriz de salida con la convolución calculada para las cuatro matrices.
Ejemplo
int c=1;
C_Image image,image2;
C_Matrix convH,convV,convdp,convds;
image2 = image;
C_Trace("Filtering Four Matrix of Convolution ...");
image.CalculateConvolution4(image2,convH,convV,convdp,convds);
C_Matrix::IndexT rowN,colN,colorsN;
C_Image::BMPFileInfo(InFile,rowN,colN,colorsN);
C_Trace("Strech Image");
91
Tratamiento Digital de Imágenes con IMtdi
image.Stretch(0,(colorsN-1));
convH.Free();
convV.Free();
convdp.Free();
convds.Free();
image.Free();
image2.Free();
Resultados
Los distintos resultados de este apartado se muestran de manera más representativa en cada
uno de los siguientes apartados reflejando diferentes aplicaciones de matrices de convolución
sobre las imágenes. Se muestra una visualización y conceptos extraídos de la aplicación para los
distintos filtros descritos a continuación.
La idea del filtro de la media es reemplazar el valor de cada píxel en una imagen por la
media aritmética de los valores de sus vecinos, incluyendo a él mismo. Esto produce el efecto de
eliminación de los valores de aquellos píxeles no representativos del contorno. El filtro de la
media es aplicado como un filtro de convolución. Como todos las convoluciones se aplica en
torno a un valor denominado kernel, que representa la forma y tamaño de los vecinos que van a
ser utilizados cuando se calcula la media.
Normalmente se utiliza una matriz de 3 × 3 para aplicar este filtro. Sin embargo, matrices
de 5 × 5 pueden usarse para una igualación de los píxeles de una imagen más severa.
92
Preprocesamiento de Imágenes
1 1 1
9 9 9
1 1 1
9 9 9
1 1 1
9 9 9
Tabla 5–3 Matriz de convolución para el cálculo de la media
Este método recibe como parámetro el tamaño de la matriz del entorno y calculando la
media para cada píxel de la imagen de sus vecinos incluyendo también al mismo píxel. Para ello
debemos definir una pequeña matriz de tamaño sizeConv x sizeConv sobre la que se calculará la
media. El valor medio resultante de esta pequeña matriz será el valor que se le asigne al píxel de
la imagen que se este recorriendo en cada paso.
• Parámetros de entrada
matrix matriz de entrada.
sizeConv tamaño de la matriz del entorno a aplicar.
• Parámetros de salida
matriz de salida.
93
Tratamiento Digital de Imágenes con IMtdi
Ejemplo
C_Image image,image2;
C_Matrix::IndexT sizeConv;
image2 = image;
C_Trace("Mean Filtering ...");
image.MeanFilter(image2,sizeConv);
image.Free();
image2.Free();
Resultados
Para mostrar el resultado de aplicar el filtro de la media presentaremos los resultados
obtenidos para ambas imágenes originales y para las matrices de 3x3 y 7x7, así como su
histograma correspondiente. Los ejemplos mostrados ilustran dos de los problemas principales
del filtro de la media:
• Un simple píxel con un valor muy poco representativo afecta al valor de la media de
todos los píxeles que son sus vecinos.
• Cuando se encuentra un borde expandido en los vecinos del píxel tratado, el filtro
interpolará nuevos valores para los píxeles del borde y así se difuminará el borde. Esto
puede ser un problema si la forma de los bordes es de importancia en la salida de la
imagen.
Estos dos problemas son abordados por el filtro de la mediana que veremos en el siguiente
apartado. Este es a menudo un mejor filtro para la reducción de ruido que el filtro de la media,
pero su cálculo es mas complejo computacionalmente. Dicho esto, mostramos los resultados
obtenidos a continuación.
94
Preprocesamiento de Imágenes
95
Tratamiento Digital de Imágenes con IMtdi
En esta segunda imagen donde los contornos son mas diferenciados, se aprecía
notablemente el problema comentado anteriormente. La aplicación del filtro de la media para la
eliminación de ruido expande los contornos de la imagen. En los histogramas es donde mejor se
aprecia la variación que sufre. A medida que la matriz de convolución crece realiza como un
estiramiento del mismo intentando eliminar los sucesivos picos de niveles de gris producidos en
la imagen. Esto es muy apreciable en la Figura 5–55. donde el histograma inicial es muy
inconsistente, en cuanto al gran número de protuberancias que contiene y en la medida que se
incrementa el tamaño de la matriz de convolución estas protuberancias van disminuyendo. Se
96
Preprocesamiento de Imágenes
produce no solo un suavizado en los niveles de gris de la imagen sino en la propia función del
histograma.
Para entender el funcionamiento basta con poner un simple ejemplo. Imaginemos que un
entorno 3 × 3 presenta los siguientes valores:
1 2 2
2 5 2
2 7 10
A continuación se ordenan:
1 2 2 2 2 2 5 7 10
se toma el elemento central al que corresponde una mediana de 2. De esta forma se observa
como los valores más semejantes tienen mayor probabilidad frente a valores aislados.
Al igual que para el filtro de la media a cada píxel de la imagen se le aplica el valor de la
mediana resultante de sus píxeles vecinos y el propio píxel, por lo que en el procedimiento que
implementa este filtro debemos volver a utilizar las imágenes que obtienen una pequeña
submatriz de la matriz de la imagen original.
97
Tratamiento Digital de Imágenes con IMtdi
• Parámetros de entrada
matrix matriz de entrada.
sizeConv tamaño de la matriz del entorno a aplicar.
• Parámetros de salida
matriz de salida.
Ejemplo
C_Image image,image2;
C_Matrix::IndexT sizeConv;
image2 = image;
C_Trace("Median Filtering ...");
image.MedianFilter(image2,sizeConv);
image.Free();
image2.Free();
Resultados
Presentaremos a continuación los resultados obtenidos al aplicar el filtro de la mediana a
las imágenes originales con matrices de 3x3 y 5x5 para comparar ambos resultados para las dos
imágenes.
98
Preprocesamiento de Imágenes
99
Tratamiento Digital de Imágenes con IMtdi
Al igual que para la figura del avión los resultados obtenidos son idénticos. En ambos
casos se aprecia una reducción del histograma, es decir, tiende a compactarse. Los comentarios
descritos anteriormente valen para esta figura.
La superioridad del filtro de mediana sobre la media es bastante evidente comparando los
resultados. No obstante, dependiendo siempre del dominio del problema. Con el filtro de la
mediana eliminas el ruido pero no las sombras, en cambio la media te permite difuminar
100
Preprocesamiento de Imágenes
eliminando la sobra de los objetos sobre superficies claras. Obviamente si la superficie del fondo
es negra no existirán sombras.
El cálculo del valor de la mediana presenta las siguientes ventajas frente al filtro de la
media.
• La mediana es un promedio mas robusto que la media, así que un simple píxel no
representativo en un vecino no afectara para el valor de la mediana de manera
significativa.
• El valor de la mediana debe ser un valor de alguno de los píxeles vecinos. El filtro de la
mediana no crea nuevos valores irreales cuando el filtro expande un contorno. Por esta
razón el filtro de la mediana es mucho mejor para preservar los bordes y contornos que
el filtro de la media.
101
Tratamiento Digital de Imágenes con IMtdi
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
a) Matriz
1 1 1 1 1
3×3
1 1 1 1 1
b) Matriz 5 × 5
1 1 1 1 1 1 1
1 1 1 1 1 1 1
1 1 1 1 1 1 1
1 1 1 1 1 1 1
1 1 1 1 1 1 1
1 1 1 1 1 1 1
1 1 1 1 1 1 1
c) Matriz 7 x7
A continuación, se muestra el procedimiento para crear una matriz de convolución del tipo
de las expuestas anteriormente. El procedimiento que lleva a cabo la aplicación de las matrices
de convolución ha sido descrito en el apartado correspondiente.
• Parámetros de entrada
number número de entrada.
• Parámetros de salida
matriz de salida.
102
Preprocesamiento de Imágenes
Ejemplo
C_Matrix::IndexT sizeConv=3;
C_Matrix::ElementT number=1;
conv.Free();
Este ejemplo se limita a calcular y almacenar una matriz de convolución paso bajo a partir
de un parámetro de entrada. La aplicación de la matriz de convolución sobre una imagen se
puede encontrar en el ejemplo del apartado correspondiente a la aplicación de matrices de
convolución.
Resultados
La matriz de convolución aplicada para mostrar los siguientes resultados es:
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
3×3 1 1 1 1 1 1 1
1 1 1 1 1 1 1
1 1 1 1 1 1 1
1 1 1 1 1 1 1
7×7
Tabla 5–5 Matriz de convolución paso bajo
Los resultados obtenidos para las distintas imágenes son los siguientes:
103
Tratamiento Digital de Imágenes con IMtdi
104
Preprocesamiento de Imágenes
A diferencia del filtro paso bajo para implementar un filtro espacial de paso alto se deben
de tener coeficientes positivos cerca de su centro y coeficientes negativos en la periferia (todo
105
Tratamiento Digital de Imágenes con IMtdi
esto relativo a la máscara de convolución). Hay que tener en cuenta que la suma total de los
coeficientes de la matriz de convolución debe de ser cero. Así, cuando la máscara está sobre un
área de nivel de gris constante o poco variable, la salida proporcionada por la máscara es cero o
un valor muy pequeño. Este resultado es coherente con lo que se espera del correspondiente
filtro en el dominio de frecuencias.
-1 -1 -1
-1 8 -1
-1 -1 -1
Tabla 5–6 Filtro espacial paso alto básico
La propiedad de que la suma total sea cero implica que la imagen puede tomar valores de
gris negativos. Debido a que sólo consideramos niveles positivos de gris, los resultados
obtenidos deben ser adaptados al intervalo [0, 255]. Una posible solución para no obtener valores
negativos sería tomar el valor absoluto de los niveles de la imagen filtrada para que así todos los
valores sean positivos, el problema es que los valores negativos grandes aparecerían muy
resaltados en la imagen.
Al igual que antes la función que implementa la aplicación de una matriz de convolución
se presenta en el apartado correspondiente a la aplicación de matrices de convolución. No
obstante, se muestra el procedimiento que permite calcular la matriz de convolución paso alto.
• Parámetros de entrada
number número de entrada.
• Parámetros de salida
matriz de salida.
106
Preprocesamiento de Imágenes
Ejemplo
C_Matrix::IndexT sizeConv=3;
C_Matrix::ElementT number=1;
conv.Free();
Este ejemplo se limita a calcular y almacenar una matriz de convolución paso alto a partir
de un parámetro de entrada.
Resultados
La matriz de convolución aplicada para mostrar los siguientes resultados es:
-1 -1 -1 -1 -1 -1 -1 -1
-1 8 -1 -1 -1 -1 -1 -1
-1 -1 -1 -1 -1 25 -1 -1
3×3 -1 -1 -1 -1 -1
Laplaciano -1 -1 -1 -1 -1
5×5
Tabla 5–7 Matrices de convolución paso alto.
Se ha tomado esta matriz de convolución de dimensiones 5 × 5 al igual que antes para que
el contraste sea mayor a la hora de comparar la imagen original con la filtrada.
En los resultados que se muestran a continuación se observan como trata de realzar los
contornos a costa de realizar un suavizado en el centro de los objetos. Este realce de contornos se
observa mejor en la figura del payaso que en el avión, esto puede deberse a que la matriz de
convolución deba ser menor, así como, por la propia definición de la función del histograma que
no permita una mejor extracción de los mismos.
Los resultados obtenidos para las distintas imágenes son los siguientes:
107
Tratamiento Digital de Imágenes con IMtdi
108
Preprocesamiento de Imágenes
109
Tratamiento Digital de Imágenes con IMtdi
110
Preprocesamiento de Imágenes
Se observa para este operador como trata de extraer la forma de los objetos sin importar el
relleno de las regiones que los contienen, es decir, se limita a la búsqueda de cambios de
contraste para determinar bordes de regiones.
-1 -1 -1
-1 9 -1
-1 -1 -1
Tabla 5–9 Operador de forma 3 ×3
111
Tratamiento Digital de Imágenes con IMtdi
Dependiendo del valor que tome A podemos obtener los siguientes resultados:
A > 1: parte del propio original se añade al resultado del filtro de paso alto, lo que
devuelve parcialmente las componentes de frecuencias bajas pérdidas en el
proceso del filtrado de paso alto. El resultado es que la imagen High-Boost se
parece más a la imagen original, con un grado relativo de mejora de los bordes
que dependen del valor de A.
112
Preprocesamiento de Imágenes
• Parámetros de entrada
conv matriz de convolución paso bajo.
A coeficiente multiplicativo de la matriz.
• Parámetros de salida
matriz de salida.
Ejemplo
C_Matrix::IndexT sizeConv=3;
C_Matrix::ElementT number=1,A=1;
C_Image image;
C_Matrix::IndexT rowN,colN,colorsN;
C_Image::BMPFileInfo(InFile,rowN,colN,colorsN);
C_Trace("Strech Image");
image.Stretch(0,(colorsN-1));
conv.Free();
113
Tratamiento Digital de Imágenes con IMtdi
Resultados
Presentaremos los resultados obtenidos al aplicar el filtro de High-Boost para las dos
imágenes cambiando el valor de A para ver el resultado producido por este factor. La matriz
aplicada ha sido la correspondiente a la Figura 5–70 correspondiente al filtro paso alto.
114
Preprocesamiento de Imágenes
Podemos comprobar como conforme aumenta el valor de A hay una mayor aproximación
a la imagen original. Además, el histograma de las diferentes imágenes es el que da una visión
más general de lo que va sucediendo. En los primeros tres histogramas los niveles de gris se
concentran en los valores centrales y en el último se obtiene una curva mejorada de la imagen en
cuestión.
Para la imagen del payaso, el filtro de High-Boost produce los siguientes resultados:
115
Tratamiento Digital de Imágenes con IMtdi
116
Preprocesamiento de Imágenes
Al igual que los comentarios realizados antes para la Figura 5–91se observa que para
valores bajos de A se obtiene una imagen suave de niveles de gris donde se describen las formas
de los distintos objetos. Mientras que a partir de un valor alto de A, la imagen tiende a semejarse
a la imagen de partida.
x2
1 −
G(x ) = e 2σ 2
2πσ
Ecuación 5–21 Función de distribución de Gauss unidimensional
117
Tratamiento Digital de Imágenes con IMtdi
x2 + y2
1 −
G ( x, y ) = e 2σ 2
2πσ 2
La idea del filtro Gaussiano es utilizada en su forma 2-D como una función de expansión
del punto. Dado que la imagen se almacena como una colección de puntos discretos, necesitamos
producir una aproximación discreta a la función Gaussiano antes de poder aplicar la
convolución. Se puede calcular una matriz que simule la distribución Gaussiano, entonces el
filtro puede simularse utilizando métodos de convolución estándar.
118
Preprocesamiento de Imágenes
Una forma adelantada de implementar el filtro Gaussiano es con una gran desviación
estándar, por lo que resulta más difícil obtener resultados en lugar de aplicar pequeños filtros
gaussianos en varias veces a la imagen original. Mientras que esto es computacionalmente
complejo, puede tener aplicabilidad si el procesamiento se esta llevando a cabo utilizando un
hardware segmentado.
• Parámetros de entrada
std desviación estándar de la fórmula para el cálculo.
• Parámetros de salida
matriz de convolución de salida.
El procedimiento explicado solo devuelve la matriz de convolución lista para ser aplicada.
En el apartado correspondiente a la aplicación de matrices de convolución. se describen los
distintos métodos especificados para la aplicación de matrices de convolución.
Ejemplo
C_Matrix::IndexT sizeConv=3;
C_Matrix::ElementT desviation;
conv.Free();
119
Tratamiento Digital de Imágenes con IMtdi
Este ejemplo se limita a calcular y almacenar una matriz de convolución paso alto a partir
de un parámetro de entrada.
Resultados
La matriz de convolución usada para el cálculo de los distintos resultados es la siguiente:
Los resultados obtenidos para las distintas imágenes son los siguientes:
120
Preprocesamiento de Imágenes
121
Tratamiento Digital de Imágenes con IMtdi
0 1 2 1 0
1 2 4 2 1
2 4 9 4 2
1 2 4 2 1
0 1 2 1 0
Tabla 5–12 Operador de la gaussiana 5 ×5
122
Preprocesamiento de Imágenes
123
Tratamiento Digital de Imágenes con IMtdi
0 0 1 1 1 0 0
0 2 8 13 8 2 0
1 8 36 60 36 8 1
1 13 60 99 60 13 1
1 8 36 60 36 8 1
0 2 8 13 8 2 0
0 0 1 1 1 0 0
Tabla 5–13 Operador de la gaussiana 7 ×7
124
Preprocesamiento de Imágenes
0 0 1 1 2 1 1 0 0
0 1 4 8 10 8 4 1 0
1 4 13 28 36 28 13 4 1
1 8 28 60 77 60 28 8 1
2 10 36 77 99 77 36 10 2
1 8 28 60 77 60 28 8 1
1 4 13 28 36 28 13 4 1
0 1 4 8 10 8 4 1 0
0 0 1 1 2 1 1 0 0
Tabla 5–14 Operador de la gaussiana 9 ×9
125
Tratamiento Digital de Imágenes con IMtdi
126
Preprocesamiento de Imágenes
0 0 0 0 1 1 1 1 1 0 0 0 0
0 0 1 1 3 4 4 4 3 1 1 0 0
0 1 2 4 8 12 13 12 8 4 2 1 0
0 1 4 10 19 28 32 28 19 10 4 1 0
1 3 8 19 36 53 60 53 36 19 8 3 1
1 4 12 28 53 77 87 77 53 28 12 4 1
1 4 13 32 60 87 99 87 60 32 13 4 1
1 4 12 28 53 77 87 77 53 28 12 4 1
1 3 8 19 36 53 60 53 36 19 8 3 1
0 1 4 10 19 28 32 28 19 10 4 1 0
0 1 2 4 8 12 13 12 8 4 2 1 0
0 0 1 1 3 4 4 4 3 1 1 0 0
0 0 0 0 1 1 1 1 1 0 0 0 0
Tabla 5–15 Operador de la gaussiana 13 × 13
127
Tratamiento Digital de Imágenes con IMtdi
0 0 1 2 3 4 4 5 4 4 3 2 1 0 0
0 1 2 4 6 8 10 10 10 8 6 4 2 1 0
1 2 4 8 12 16 19 21 19 16 12 8 4 2 1
2 4 8 13 21 28 34 36 34 28 21 13 8 4 2
3 6 12 21 32 44 53 56 53 44 32 21 12 6 3
4 8 16 28 44 60 72 77 72 60 44 28 16 8 4
4 10 19 34 53 72 87 93 87 72 53 34 19 10 4
5 10 21 36 56 77 93 99 93 77 56 36 21 10 5
4 10 19 34 53 72 87 93 87 72 53 34 19 10 4
4 8 16 28 44 60 72 77 72 60 44 28 16 8 4
3 6 12 21 32 44 53 56 53 44 32 21 12 6 3
2 4 8 13 21 28 34 36 34 28 21 13 8 4 2
1 2 4 8 12 16 19 21 19 16 12 8 4 2 1
0 1 2 4 6 8 10 10 10 8 6 4 2 1 0
0 0 1 2 3 4 4 5 4 4 3 2 1 0 0
Tabla 5–16 Operador de la gaussiana 15 × 15
128
Preprocesamiento de Imágenes
129
Tratamiento Digital de Imágenes con IMtdi
Para cada uno de los ejemplos observados se puede extraer el concepto de suavizado en la
eliminación de ruido a costa de una borrosidad en la imagen. A medida que aumenta el tamaño
de la matriz de convolución la región sobre la que actúa es mayor y en consecuencia la
borrosidad de la imagen se ve seriamente afectada.
Este filtro se ejecuta mediante un procedimiento que primero busca el mínimo y el máximo
de los valores de intensidad dentro de la región de una ventana y redondea el píxel en cuestión.
Si la intensidad del píxel central se encuentra entre la intensidad del rango de sus vecinos, se
pasa a la salida sin cambiar de valor. Sin embargo, si el píxel central supera el máximo , se le
asigna el valor del máximo, si es menor que el mínimo valor, se le asigna el mínimo valor.
23 25 26 30 40
22 24 26 27 35
18 20 50 25 34
19 15 19 23 33
11 16 10 20 30
Tabla 5–17 Submatriz de una imagen
130
Preprocesamiento de Imágenes
• Valores de los vecinos: 15, 19, 20, 23, 24, 25, 26, 27.
• Parámetros de entrada
matrix matriz de la imagen de entrada.
SizeConv tamaño de la matriz de convolución a aplicar.
• Parámetros de salida
matriz de la imagen de salida.
Las imágenes son muy a menudo corrompidas por ruido de muy diversas maneras, la más
frecuente es un ruido adicional o ruido impulsivo. Los filtros lineales como el filtro de la media,
son la primera herramienta para un degradado de la imagen para la eliminación de ruido. El
131
Tratamiento Digital de Imágenes con IMtdi
resultado del filtro de la conservación produce una imagen que todavía contiene algo de ruido en
zonas donde los píxeles vecinos presentan un pico en la intensidad.
El filtro de conservación trabaja bien para niveles bajos de ruido del estilo de gotas sobre la
imagen. Sin embargo, la imagen ha sido corrompida de tal forma que más de un píxel ha sido
afectado por la intensidad de sus vecinos.
Ejemplo
C_Image image,image2;
C_Matrix::IndexT sizeConv;
image2 = image;
C_Trace("Conservation Filtering ...");
image.ConservationFilter(image2,sizeConv);
image.Free();
image2.Free();
Resultados
En los resultados obtenidos y mostrados en las siguientes páginas, se observa como en
ambas imágenes la aplicación resulta mínima. Es decir, el nombre de conservación del filtro lo
define de manera precisa. Este filtro está pensado en imágenes donde aparecen ruidos o
imperfecciones aisladas y permite una visualización perfecta de la imagen sin mostrar ningún
tipo de modificación en las siluetas que contenga.
Los resultados obtenidos para las distintas imágenes son los siguientes:
132
Preprocesamiento de Imágenes
Figura 5–124 Imagen filtrada por conservación (29 × 29) ‘aviongr.bmp’ y su histograma
133
Tratamiento Digital de Imágenes con IMtdi
Figura 5–127 Imagen filtrada por conservación (29 × 29) ‘payaso.bmp’ y su histograma
El operador tiene una forma simple. Suponemos que a la misma vez tres píxeles
consecutivos están siendo examinados como a, b y c. El algoritmo es el siguiente:
Para cada iteración se puede elegir entre un de los dos procedimientos que se muestran:
134
Preprocesamiento de Imágenes
Para todas las iteraciones, el efecto de filtrar de esta manera elimina los picos de
intensidad. Es decir, el algoritmo filtra la imagen reduciendo la magnitud de una inconsistencia
de píxel local, como también incrementa la magnitud del valor del píxel en redondeo con los
valores de sus vecinos.
135
Tratamiento Digital de Imágenes con IMtdi
• Parámetros de entrada
matrix matriz de la imagen de entrada.
isDark parámetro que indica si se desea aclarar o oscurecer la imagen.
• Parámetros de salida
matriz de la imagen de salida.
Para cada píxel se debe calcular la región de la ventana correspondiente al entorno del
píxel que esta siendo tratado en cada iteración. Sobre esta matriz y según el parámetro de entrada
isDark (1-oscurecer, 0-aclarar), se aplica la función AdjustDark() o AdjustLight().
• Parámetros de entrada
a b c valores correspondientes a los píxel vecinos analizados.
• Parámetros de salida
valor de salida obtenido en función del tipo de procedimiento y que se asigna al
píxel tratado.
Ejemplo
C_Image image,image2;
C_Matrix::IndexT rowN,colN,colorsN;
int isDark;
image2 = image;
C_Trace("Crimmins Speckel Removing ...");
image.CrimminsFilter(image2,isDark);
C_Image::BMPFileInfo(InFile,rowN,colN,colorsN);
C_Trace("Strech Image");
image.Stretch(0,(colorsN-1));
136
Preprocesamiento de Imágenes
image.Free();
image2.Free();
Resultados
Los resultados obtenidos son los que se muestran a continuación:
137
Tratamiento Digital de Imágenes con IMtdi
Los resultados obtenidos para el avión son un tanto confusos puede ser por el tipo de
imagen en si donde hay mucho contraste entre la diversidad de objetos que la contienen. En
cambio la funcionalidad del algoritmo se aprecia mejor en la imagen del payaso donde al
oscurecerla la intensidad en el histograma se observa como se incrementan las regiones de color
más oscuro y al esclarecer se reducen los tonos oscuros incrementándose en la misma proporción
los claros.
138
Preprocesamiento de Imágenes
∂f
∇f = ∂∂fx
∂y
Ecuación 5–23 Operador gradiente
1
∂f 2 ∂f
2
2
∇ f =
∂x ∂y
Ecuación 5–24 Módulo del operador gradiente
z1 z2 z3
z4 z5 z6
z7 z8 z9
la ecuación anterior puede aproximarse alrededor del punto z 5 de distintas formas. La más
[ ],
1
cruzadas: ∇f ≈ ( z 5 − z 9 ) + ( z 6 − z 8 )
2 2 2
de forma similar mediante valores absolutos sería
∇f ≈ z 5 − z 9 + z 6 − z 8 .
Otra aproximación a la ecuación inicial, con la salvedad que ahora se usa todo el entorno
3 × 3, es ∇f ≈ (z 7 + z 8 + z 9 ) − ( z1 + z 2 + z 3 ) + ( z 3 + z 6 + z 9 ) − (z1 + z 4 + z 7 ) .
139
Tratamiento Digital de Imágenes con IMtdi
Resultados
Existen distintos tipos de operadores para el cálculo del gradiente entre los que cabe
destacar: los operadores de Sobel y de Prewitt. A continuación se especifican cada uno de los
operadores y los resultados obtenidos con ambos.
-1 0 1 1 2 1
-2 0 2 0 0 0
-1 0 1 -1 -2 -1
Tabla 5–18 Operadores de Sobel
-1 0 1 -1 -1 -1
-1 0 1 0 0 0
-1 0 1 1 1 1
Tabla 5–19 Operadores de Prewitt
140
Preprocesamiento de Imágenes
Figura 5–136 Imagen filtrada por los operadores de Sobel ‘aviongr.bmp’ y su histograma
Figura 5–137 Imagen filtrada por los operadores de Prewitt ‘aviongr.bmp’ y su histograma
Figura 5–139 Imagen filtrada por los operadores de Sobel ‘payaso.bmp’ y su histograma
141
Tratamiento Digital de Imágenes con IMtdi
Figura 5–140 Imagen filtrada por los operadores de Prewitt ‘payaso.bmp’ y su histograma
Se observa como en las figuras la aplicación del operador de Sobel resalta las regiones
oscuras y hunde las regiones claras, así como el operador de Prewitt produce el efecto inverso, es
decir, resalta las regiones claras y hunde las regiones oscuras. Este efecto se produce
principalmente por la aplicación de la función de suavizado a los niveles de gris obtenidos en el
proceso. Realmente lo que se aprecia es el conjunto de contornos extraídos que posibilitan la
separación de las distintas regiones en función de la diferencia de contraste entre los niveles de
gris existentes.
142
Preprocesamiento de Imágenes
1 1 0
1 0 -1
0 -1 -1
Tabla 5–21 Operador de derivación 3 ×3
143
Tratamiento Digital de Imágenes con IMtdi
144
Preprocesamiento de Imágenes
0 0 0 0 0
1 2 4 2 1
0 0 0 0 0
-1 -2 -4 -2 -1
0 0 0 0 0
Tabla 5–22 Operador de derivación 5 ×5
145
Tratamiento Digital de Imágenes con IMtdi
Figura 5–154 Imagen tratada por el operador diferencial de la Gaussiana ‘aviongr.bmp’ y su histograma.
146
Preprocesamiento de Imágenes
Figura 5–156 Imagen tratada por el operador diferencial de la Gaussiana ‘payaso.bmp’ y su histograma
0 -1 -2 -1 0
-1 -4 -1 -4 -1
-2 -1 36 -1 -2
-1 -4 -1 -4 -1
0 -1 -2 -1 0
Tabla 5–24 Operador DoG (Diferencial de la Gaussiana) 5 ×5
147
Tratamiento Digital de Imágenes con IMtdi
148
Preprocesamiento de Imágenes
0 0 0 0 -1 0 0 0 0
0 0 -1 -2 -3 -2 -1 0 0
0 -1 -4 -7 -8 -7 -4 -1 0
0 -2 -7 -2 18 -2 -7 -2 0
-1 -3 -8 18 80 18 -8 -3 -1
0 -2 -7 -2 18 -2 -7 -2 0
0 -1 -4 -7 -8 -7 -4 -1 0
0 0 -1 -2 -3 -2 -1 0 0
0 0 0 0 -1 0 0 0 0
Tabla 5–25 Operador DoG 9 ×9
149
Tratamiento Digital de Imágenes con IMtdi
0 0 0 -1 -1 -1 -1 -1 0 0 0
0 -1 -1 -2 -3 -4 -3 -2 -1 -1 0
0 -1 -3 -5 -7 -8 -7 -5 -3 -1 0
-1 -2 -5 -8 -6 -2 -6 -8 -5 -2 -1
-1 -3 -7 -6 18 41 18 -6 -7 -3 -1
-1 -4 -8 -2 41 80 41 -2 -8 -4 -1
-1 -3 -7 -6 18 41 18 -6 -7 -3 -1
-1 -2 -5 -8 -6 -2 -6 -8 -5 -2 -1
0 -1 -3 -5 -7 -8 -7 -5 -3 -1 0
0 -1 -1 -2 -3 -4 -3 -2 -1 -1 0
0 0 0 -1 -1 -1 -1 -1 0 0 0
Tabla 5–26 Operador DoG 11 × 11
150
Preprocesamiento de Imágenes
151
Tratamiento Digital de Imágenes con IMtdi
0 0 0 0 -1 -1 -1 -1 -1 -1 -1 0 0 0 0
0 0 -1 -1 -2 -2 -3 -3 -3 -2 -2 -1 -1 0 0
0 -1 -1 -2 -3 -4 -5 -5 -5 -4 -3 -2 -1 -1 0
0 -1 -2 -3 -5 -7 -7 -8 -7 -7 -5 -3 -2 -1 0
-1 -2 -3 -5 -7 -7 -5 -4 -5 -7 -7 -5 -3 -2 -1
-1 -2 -4 -7 -7 -2 10 17 10 -2 -7 -7 -4 -2 -1
-1 -3 -5 -7 -5 10 38 54 38 10 -5 -7 -5 -3 -1
-1 -3 -5 -8 -4 17 54 76 54 17 -4 -8 -5 -3 -1
-1 -3 -5 -7 -5 10 38 54 38 10 -5 -7 -5 -3 -1
-1 -2 -4 -7 -7 -2 10 17 10 -2 -7 -7 -4 -2 -1
-1 -2 -3 -5 -7 -7 -5 -4 -5 -7 -7 -5 -3 -2 -1
0 -1 -2 -3 -5 -7 -7 -8 -7 -7 -5 -3 -2 -1 0
0 -1 -1 -2 -3 -4 -5 -5 -5 -4 -3 -2 -1 -1 0
0 0 -1 -1 -2 -2 -3 -3 -3 -2 -2 -1 -1 0 0
0 0 0 0 -1 -1 -1 -1 -1 -1 -1 0 0 0 0
Tabla 5–27 Operador DoG 15 × 15
152
Preprocesamiento de Imágenes
153
6 Bibliografía
[2] GONZALEZ, R.
Digital Image Processing, Addison Wesley.
(1992).
[3] PARKER J. R.
Algorithms for image processing and computer vision.
Wiley Computer Publishing.
(1996).
[4] SONKA, M.
Image Processing, Analysis and Machine Vision, Champan & Hall.
(1995).
155