Вы находитесь на странице: 1из 8

Procesamiento de imágenes digitales

Guillermo Ambrosio.-2008-18890
20 de mayo de 2010

Resumen
El procesamiento de imágenes digitales consiste en la transformación de cada uno de los puntos (o pixeles)
en una imagen digital mediante un algoritmo. Las imágenes digitales que actualmente son planas y representadas
en formato bidimensional; esto es, son un arreglo rectangular de datos; tienen una dimensión de altura y una
dimensión de ancho y por lo tanto pueden ser representadas como un lugar geométrico rectangular en un plano.
Algunas transformaciones simples pueden implementarse en la práctica como aplicaciones lineales que transforman
un vector de R2 en otro vector R2 , es decir; de una imagen a otra imagen, ambas bidimensionales. Éstas son
llamadas transformaciones geométricas (que no necesariamente se refieren al mismo concepto que aplicaciones
geométricas). Además existen otros tipos de transformaciones lineales llamadas point-wise; esto significa que no
transforman las coordenadas de los pixeles de la imagen sino que modifican los valores de cada uno de los pixeles;
ya sea para balancear el brillo, el contraste o el color, por ejemplo. En las transformaciones point-wise se usa la
convolución y los histogramas.

Introducción
Las imágenes digitales son procesadas digitalmente vistas como mapas de bits de dos dimensiones, y por lo tanto
pueden representarse como el espacio vectorial del plano, también pueden ser vistas como matrices, para realizar
técnicas como la de convolución.
En este artı́culo se presenta brevemente la teorı́a matemática tras las operaciones necesarias para transformaciones
básicas de imágenes digitales y el aspecto práctico para implementarlas en un programa de computadora; desarrollo
algunos temas sobre álgebra lineal, suficiente para poder desarrollar los algoritmos de procesamiento en la práctica.
Estos conceptos matemáticos, como por ejemplo las aplicaciones lineales, facilitan y dan formalidad a las técnicas de
procesamiento.

1. Marco Teórico
1.1. Espacios Vectoriales
Los espacios vectoriales son conjuntos cuyos elementos cumplen con la cerradura de la suma, es decir que la suma
de dos de sus elementos dé un elemento que esté dentro del conjunto; y la multiplicación de un elemento por una
cantidad también resulta en un elemento contenido en el conjunto. Además de esto, sus elementos deben cumplir las
siguientes condiciones:

1. ~x + ~y = ~y + ~x.

1
2. (~x + ~y ) + ~z = ~x + (~y + ~z).
3. La existencia del vector origen 0 tal que ~x + 0 = ~x.
4. La existencia del vector inverso −~x, para el vector ~x tal que ~x + (−~x) = 0.
5. Si c es un número,entonces c(~x + ~y ) = c~x + c~y .

6. Si a y b son números, entonces (a + b)~x = a~x + b~x.


7. Si a y b son números, entonces (ab~x) = a(b~x).
8. 1~x = ~x.

1.1.1. Espacio vectorial R2


El espacio vectorial de dos dimensiones contiene parejas de números reales. Un plano encaja en este espacio vectorial
y generalmente al hablar de un plano se habla del espacio vectorial R2 . Estas parejas de números suelen expresarse
como (x,y) y a ésto se le llama vector. Al realizar operaciones con matrices estas parejas de números, coordenadas, se
representan verticalmente, como un vector columna: (x, y)T .

1.2. Aplicaciones Lineales


Una aplicación lineal asigna elementos de un conjunto imagen a todos los elementos de un conjunto dominio, donde
los conjuntos dominio e imagen son espacios vectoriales; y preserva las operaciones de suma de vectores y producto
por un escalar.
Una aplicación F de R2 en R2 se representa ası́:

F : R2 → R2

Toda aplicación lineal tiene una matriz asociada tal que F : R2 → R2 puede expresarse ası́ F (X) = M · X para
cada vector columna X del espacio R2 , es decir para todo par de coordenadas, y donde M es la matriz asociada a F.

1.3. Operaciones Point-wise


Las operaciones más básicas son las llamadas point-wise, lo que significa que la operación es sobre cada punto y
no sobre las coordenadas de éstos. Estas transformaciones son generalmente de balance de color, brillo y contraste.
Las operaciones point-wise más elaboradas usan la operación de convolución que procesa cada punto de acuerdo a los
puntos que le rodean mediante una matriz de convolución que se centra en el punto a manipular. Con éste método de
convolución existen filtros diferenciales que detectan las razones de cambio a lo largo de la imagen, filtros de ruido,
filtros de detección de bordes, etc.
Abordaré en este artı́culo el emborronado mediante matriz de convolución para dar un ejemplo sobre la imple-
mentación de dicha técnica.

2
1.3.1. Convolución
La convolución es un operador matemático que transforma funciones f y g en una tercera función, las funciones
son superpuestas y g es invertida y trasladada por un parámetro, que en las aplicaciones de señales en el tiempo, como
el audio por ejemplo, suele ser el tiempo.
Z
f (t) ∗ g(t) = f (τ )g(t − τ )

Está definida para funciones; es una aplicación lineal del espacio de las funciones en el espacio de las funciones.
En el caso de señales digitales, hablamos de señales discretas, como lo son las imágenes digitales o las señales de
audio digital. Las señales digitales no son continuas; son discretas y por esto no se puede usar la definición anterior
dado que los datos están dispuestos de manera no continua, y estan disponibles en instantes del tiempo y es por eso
necesaria una definición numérica como la siguiente:
X
h[m] = f [m] ∗ g[m] = f [n]g[m − n]
n
En este caso h, f y g son vectores; g es el vector de convolución, o también llamado en ocasiones matriz de
convolución. También puede representarse f y g como sumatorias de productos entre los valores discretos y la función
de impulso unitario desplazada a lo largo de la señal, que es lo que lleva a formular la definición anterior de convolución.
Para definir una señal discreta matemáticamente usando la función de impulso unitario δ

1 x=0
δ(x) =
0 x 6= 0

X
f [x] = f [k]δ[x − k]
k=−∞

Convolución en forma de producto matricial. Donde h[n] es un sistema discreto lineal de n elementos, x[n] es
una señal discreta. La respuesta a la operación y[m] = x[n] ∗ h[n] se expresa de la siguiente manera:
 T    
x[0] h[0] h[1] h[2] ... h[n] 0k ... 02 ∗ n − 1 y[0]
 x[1]   0
   h[0] h[1] h[2] ... h[n] 0k ... 02 ∗ n − 2 
 y[1] 

 x[2]   0
   0 h[0] h[1] h[2] ... h[n] 0 k ... 0 2 ∗ n − 3
 
 y[2] 

 .   . = . 
     
 .   .   . 
     
 .   .   . 
x[n] 0 0 ... h[0] h[1] h[2] ... h[n] y[2 ∗ n − 1]

Ejemplo
   
Supongamos la matriz x = 7 8 9 8 5 4 y la matriz de convolución h = 1 2 1 .
Luego  
1 2 1 0 0 0 0 0
0 1 2 1 0 0 0 0
 
0 0 1 2 1 0 0 0  
x· 0 0
= 7 22 32 34 30 22 13 4
 0 1 2 1 0 0
0 0 0 0 1 2 1 0
0 0 0 0 0 1 2 1

3
Esta operación matricial de convolución es clasificada como un sistema discreto lineal.
La convolución también tiene ciertas propiedades matemáticas, entre las fundamentales están la conmutatividad,
asociatividad, distributividad y asociatividad con multiplicación escalar.

1.4. Transformaciones Geométricas


Se incluyen las transformaciones geométricas más importantes usadas para el procesamiento de imágenes a contin-
uación. Se proporciona la matriz de la operación para cada transformación. La operación para transformar los vectores
de la imagen original, donde (x, y) es un vector en la imagen original, en el vector en la nueva imagen (x0 , y 0 ) es de
la siguiente manera:

(x0 , y 0 )T = A · (x, y)T


La manera de construı́r estas matrices es situando el vector coordenadas transformadas transpuesto en cada uno
de sus vectores columna.

1.4.1. Transformaciones Euclı́deas


Rotar
Para rotar una imagen digital se usa la aplicación lineal que gira los ejes x e y por un grado θ, ésta aplicación tiene
la siguiente matriz asociada:
 
cos(θ) − sin(θ)
A=
sin(θ) cos(θ)

Reflejar en x
Esta aplicación refleja la imagen en el eje x. Como puede verse el primer vector columna que es (1 0) mantiene
igual la base unitaria del eje x, en cambio, al ver el segundo vector columna transpuesto (0 -1) se puede observar que
la segunda coordenada está negada; con lo cual la imagen se refleja verticalmente, esto es: en el eje x.
 
1 0
A=
0 −1

Reflejar en y

 
−1 0
A=
0 1

Torcer

 
ab + 1 a
A=
b 1

4
Ésta transformación rota los ejes x e y sin que queden necesariamente perpendiculares. Las coordenadas transfor-
madas quedan de esta manera:
x0 = x + ay
y 0 = y + bx
Los ejes quedan inclinados por un factor b y a para x y y respectivamente.

Escalar

 
s1 0
A=
0 s2
s1 es el factor de escala horizontal y s2 el factor de escala vertical

Traslación
Para trasladar una imagen en el plano, desde un punto de vista matemático, se puede sumar una matriz con los
desplazamientos ası́: (x, y) + (a, b) = (x + a, y + b). Otro método consiste en usar coordenadas homogéneas.

2. Transformaciones Geométricas en la práctica


Para implementar estas transformaciones en un lenguaje de programación, es necesario definir las operaciones que
se llevan a cabo en la operación de producto entre matrices ya que las computadoras no saben cómo realizar ese
producto. Esto se puede hacer con código C/C++ como el siguiente:

for(int i=1,j,k; i<=filasA;i++){


for (j=1;j<=colsB;j++){
C[i][j] = 0;
for (k=1;k<=filasA;k++)
C[i][j] += A[i][j]*B[k][j];
}
}

Donde A · B = C. Si bien este logaritmo realiza una multiplicación de matrices completa y general para cualquier
tamaño de matrices, necesita los valores definidos dentro de los arrays (el tipo de dato usado para representar a
las matrices en el caso de C/C++) A y B; ya que los lenguajes de programación comunes no pueden manejar
variables simbólicas como lo son x e y en el vector (x, y)T ; sino sólo variables con valores conocidos. Además para
implementar transformaciones geométricas en el plano R2 , necesitamos solamente matrices de 3x3 o 2x2 y el algoritmo
anterior podrı́a resumirse en un algoritmo donde no se haga uso de ciclos y saltos condicionales, y que por lo tanto
consumirá menos recursos. Tomar en cuenta también que esta multiplicación de matrices es para todos y cada uno
de los puntos en una imagen ası́ mientras más cargado sea operar cada punto, esta carga se multiplica por el número
de puntos en la imagen. Por esto las transformaciones geométricas se implementan con un algoritmo especı́fico para
cada tipo de transformación. Por ejemplo, la rotación puede implementarse ası́:

5
x2 = x1*cos_theta - x1*sen_theta;
y2 = x2*sen_theta + x1*cos_theta;

Donde x1 e y1 son las coordenadas originales, x2 e y2 son las coordenadas rotadas y los valores cos(θ) y sen(θ)
ya han sido calculados y están almacenados en las variables sen theta y cos theta.
En el caso de escalar una imagen, la transformación matemática parece simple pero en la práctica es necesario
definir un método para deducir los pixeles de la nueva imagen, ya sea por replicación o interpolación. Por replicación
me refiero a copiar un pixel determinado de la imagen original a la imagen nueva y por interpolación a calcular el valor
del pixel de acuerdo a los pixeles que estén alrededor. Los métodos de interpolación tienen resultados mejores pero
consumen más recursos.

3. Blur mediante convolución


El blur (o emborronado) de imágenes gaussiano es hecho generalmente mediante el proceso de convolución usando
matrices. Tiene un efecto de suavizado de la imagen. Es, de hecho, un filtro pasa bajos que suaviza los cambios bruscos
en la imagen, como por ejemplo los bordes de los objetos. Tiene la ventaja de ser simétrico circularmente, por lo que
es posible realizar el procedimiento de convolución con un vector de una matriz, en vez de una matriz cuadrada, lo que
consumirı́a más recursos de procesamiento. Este vector de matriz es operado de manera horizontal y vertical mediante
la técnica de convolución discreta vista.
x2
1 − 2σ
Es llamado blur gaussiano porque usa la función de G(x) = √2πσ 2
e 2
de Gauss. Esto causa que cada pixel de
la imagen tome el valor de un promedio ponderado de sus pixeles cercanos, dependiendo del tamaño de la matriz de
convolución.
Una manera para obtener los números para el vector de matriz de convolución gaussiana es con el triángulo de
pascal; ası́ un vector útil podrı́a ser (1 6 15 20 15 6 1), que es el renglón 6 de éste.
Para hacer la convolución se usa la fórmula vista, donde n varı́a desde 0 a la longitud del vector menos 1, f [] es
el vector de convolución, g[] es un vector renglón o columna de la imagen y m es el número de pixel en la imagen.
X
f [n]g[m − n]
n

Hace falta también un factor que normalice el resultado, lo que dejarı́a la fórmula ası́:
1 X
P f [n]g[m − n]
n f [n] n

El algoritmo es como sigue:

Para cada pixel ( i , j ) en el mapa de bits intermedio


• Deducir su color usando la fórmula, los pixeles del mapa de bits de origen y el vector horizontal de la matrix
(por ejemplo (1 2 1))
• Poner el pixel en el mapa de bits intermedio
Para cada pixel ( i , j ) en el mapa de bits de salida
• Deducir su color usando la fórmula, los pixeles del mapa de bits intermedio y el vector vertical de la matriz
(por ejemplo : (1 2 1)T)

6
• Poner el pizel en el mapa de bits de salida.

#define gauss_ancho 7

sumr=0;
sumg=0;
sumb=0;

int gauss_factores[ancho_gauss]={1,6,15,20,15,6,1}; // Esto es la matriz de convolucion


int gauss_sum=64;

for(i=1;i<entrada->w-1;i++){
for(j=1;j<entrada->h-1;j++){
sumr=0;
sumg=0;
sumb=0;
for(k=0;k<gauss_ancho;k++){
color=getpixel(entrada,i-((gauss_ancho-1)>>1)+k,j);
r=getr32(color);
g=getg32(color);
b=getb32(color);
sumr+=r*gauss_factores[k];
sumg+=g*gauss_factores[k];
sumb+=b*gauss_factores[k];

}
putpixel(intermedio,i,j,makecol(sumr/gauss_sum,sumg/gauss_sum,
sumb/gauss_sum));
}
}

for(i=1;i<entrada->w-1;i++){
for(j=1;j<entrada->h-1;j++){
sumr=0;
sumg=0;
sumb=0;
for(k=0;k<gauss_ancho;k++){
color=getpixel(intermedio,i,j-((gauss_ancho-1)>>1)+k);
r=getr32(color);
g=getg32(color);
b=getb32(color);

sumr+=r*gauss_factores[k];
sumg+=g*gauss_factores[k];
sumb+=b*gauss_factores[k];
}

7
sumr/=gauss_sum;
sumg/=gauss_sum;
sumb/=gauss_sum;

putpixel(salida,i,j,makecol(sumr,sumg,sumb));
}
}

Aquı́ tenemos un ejemplo de imagen emborronada con este algoritmo.

Las aplicaciones para la técnica de convolución en imágenes digitales son muy importantes y amplias, ya que a
partir de éstas se realizan también análisis para detección de bordes, detección de movimiento en varias imágenes,
reconocimiento de forma, y filtros diversos.

Conclusiones
Los mapas de bits, de las imágenes digitales, pueden ser manipulados como espacios vectoriales de dos dimen-
siones. Gracias a esto pueden ser transformados usando conceptos matemáticos del álgebra lineal.

El procesamiento de imágenes digitales por computadora tiene limitaciones y no es capaz de entender un lenguaje
matemático formal; es por esto que es necesario idear algoritmos eficientes, además de idear técnicas que eviten
ciertos efectos indeseados (como, por ejemplo, al agrandar una imagen sin usar alguna técnica de suavizado, ésta
se verá con pixeles grandes y de esquinas remarcadas, o al hacerla pequeña, ésta puede ver efectos de aliasing).

Referencias
[1] Serge Lang, Álgebra Lineal
[2] Frederic Patin, artı́culo en lı́nea http://www.gamedev.net/reference/articles/article2007.asp
[3] Enciclopedia en lı́nea libre Wikipedia.

Вам также может понравиться