You are on page 1of 20

Tarea n1 Procesamiento Digital De Imgenes

Alumno: Jos Luis Verdugo Aros Curso: Procesamiento Digital de Imgenes MIE804-1 Profesor: Gabriel Hermosilla Fecha: 29 de Octubre de 2013

Introduccin En el presente informe, se estudiara inicialmente, la implementacin del algoritmo para la obtencin de la Transformada discreta de Fourier 2D, en MATLAB, para lo cual se programaran dos scripts. Cada uno de estos script, ejecutara un algoritmo distinto al del otro, pero ambos tendrn como resultado, la obtencin de la transformada discreta de Fourier 2D, cuando sean aplicados a una imagen. La finalidad de este ejercicio, es lograr comparar los tiempos de ejecucin que tienen estos dos algoritmos al ser aplicados sobre una misma imagen. Luego los datos de tiempo y de transformadas de la imagen (recordar que son dos transformadas de la misma imagen, una por cada algoritmo), son comparados con los resultados obtenidos al aplicar sobre la imagen de muestra, la funcin FFT2 (Transformada Rpida de Fourier 2D) disponible en las libreras de MATLAB. Posteriormente se proceder a separar modulo y fase de las transformadas obtenidas, para luego aplicar filtros pasa altos y pasa bajos en el dominio de la frecuencia. Para finalizar se aplicara la FFT2 a una segunda imagen de prueba, la transformada obtenida es separada en modulo y fase. Luego a partir del 50% de informacin de la fase, se reconstruir la imagen utilizando la funcin IFFT2 (Transformada Rpida de Fourier inversa 2D). Qu nos representa la transformada de Fourier 2D, cuando se aplica a una imagen? La transformada de Fourier es una representacin de la imagen como una suma de exponenciales complejas de distintas amplitudes, frecuencias y fases, las cuales definen los cambios espaciales que ocurren en la imagen. Por lo tanto, si la imagen tiene cambios bruscos en la intensidad de sus colores, entonces, sus componentes son de alta frecuencia (principalmente los bordes de las figuras, objetos personas, etc.). En cambio si la imagen es relativamente suave, es decir no existen cambios bruscos en la intensidad de los colores (la mayor parte de la imagen corresponde a una superficie de un mismo color o tonalidades similares) tiene una mayor cantidad componentes de baja frecuencia.

Como se est trabajando, con imgenes digitales, entonces corresponde aplicar en este caso la transformada discreta de Fourier en 2D, la cual es representada mediante la siguiente ecuacin:

FIG. Ecuacin de la Transformada Discreta de Fourier 2D. Donde bsicamente: k1 y k2: Coordenadas de cada pixel de la transformada (filas-columnas respectivamente). n1 y n2: Coordenadas de cada pixel de la imagen a la que se le aplica la transformada (filascolumnas respectivamente). N1 y N2: Dimensiones de la imagen de prueba, a la que se aplica la transformada (filas-columnas respectivamente). Con la ecuacin anterior se obtiene la transformada de un pixel de la imagen. Como se puede apreciar no es un clculo para nada simple, y si a esto se le suma, que el tamao comn de las imgenes en la actualidad es del orden de los Mega pixeles, se requiere una gran cantidad de tiempo y capacidad de procesamiento de los equipos para ejecutar el proceso de transformacin. Debido a lo anterior, es que surgen nuevos algoritmos para la aplicacin de esta transformada, con los cuales se obtienen resultados similares, pero que conllevan un menor costo, ya sea en complejidad de clculos, nmero de clculos y tiempo. Uno de estos algoritmos es el denominado Transformada Discreta de Fourier 2D por descomposicin fila-columna. Como su nombre lo indica, primero se realizan los clculos correspondientes a las filas de la imagen original, para entonces a partir del valor ya calculado de las filas, realizar los clculos correspondientes a las columnas de la imagen original, de esta manera se simplifica la complejidad de los clculos y por ende disminuye el tiempo. Este algoritmo es representado por la siguiente ecuacin:

FIG. Ecuacin de la Transformada Discreta de Fourier 2D por descomposicin fila-columna.

El algoritmo ms usado, debido a que se requiere una significativamente menor cantidad de clculos y por ende menor tiempo, es la transformada rpida de Fourier o FFT por sus siglas en ingles. Este consisten bsicamente en: Considerar que N es un nmero par y mediante algunas identidades matemticas, se obtienen los trminos H y G, similares a la ecuacin original de la DFT, el beneficio de esto es que ahora deben tratarse secuencias de un medio de la longitud original, lo que permite un importante ahorro de tiempo.

FIG. Ecuacin de la FFT Dnde:

FIG. Trminos con los cuales se calcula la FFT

Parte 1: Implementacin de los algoritmos Nota: La implementacin se desarroll en un equipo con procesador intel Core Duo Processor T2250(2M Cache, 1.73 GHz, 533 MHz FSB) , MATLAB R2013a y 1.5GB RAM. a) Se implement la dft2 (algoritmo original) mediante la programacin de un script (Para revisin de los cdigos, revisar anexo), los resultados fueron los siguientes: Tiempo: 124.989 segundos Grafico Modulo Grafico Fase

b) Luego se implement el algoritmo de DFT-2D por descomposicin fila-columna, el tiempo que demoro en aplicar la transformada y los grficos de modulo y fase, se presentan a continuacin: Tiempo: 112.3384 segundos Grafico Modulo Grafico Fase

c) Finalmente, se ejecut sobre la imagen de prueba, el comando fft2, correspondiente a la transformada rpida de Fourier en MATLAB. Los resultados obtenidos son los siguientes: Tiempo: 0.066548 segundos Grafico Modulo Grafico Fase

Comparando los resultados de la aplicacin de los distintos algoritmos, se aprecia que la mayor diferencia es el tiempo que demora en obtener la transformada. Los mdulos y fases obtenidos para cada algoritmo, son prcticamente idnticos, esto se puede comprobar, aplicando la transformada rpida inversa de Fourier 2D (IFFT2), a las transformadas obtenidas con los distintos algoritmos implementados, y luego presentar la imagen resultante en el dominio espacial. Alg. DFT 2D Alg. DFT 2D descomp. F-C Alg. FFT2 de MATLAB

Tabla Resumen de Tiempos en segundos de ejecucin de los Algoritmos Caractersticas del PC: -Modelo: Dell Inspiron 6400 -Procesador intel Core Duo Processor T2250(2M Cache, 1.73 GHz, 533 MHz FSB) -Matlab R2013a -1.5GB de memoria RAM Alg. DFT 2D Alg. DFT 2D descomp. F-C Alg. FFT2 de MATLAB 124.989 segundos 112.3384 segundos 0.066548 segundos

Parte 2: Filtrado Para una mejor apreciacin del filtrado, en esta parte, se utilizara la imagen lena.bmp, en su tamao original de 512X512 pixeles, a la cual se le aplicara el comando FFT2 que viene en las libreras de MATLAB, ya que como se vio anteriormente es el que menos tiempo demora, de los algoritmos implementados.

FIG3. Lena original en escala de grises

Al ser aplicado un filtro (cuadrado de 6X6) pasa alto a la imagen, en el dominio de la frecuencia, el grafico del mdulo filtrado y la imagen en el dominio temporal resultan ser los siguientes: Filtro Pasa Alto Dominio de la frecuencia Dominio Espacial

De lo anterior se puede concluir, que gran parte de la informacin de la imagen se encuentra justamente en la zona de las bajas frecuencias, esto me indica que, en el dominio temporal, la imagen no presenta cambios bruscos en sus intensidades de color, o en escala de grises en este caso. Al ser aplicado un filtro pasa bajo (cuadrado de 100x100), en el dominio de la frecuencia, los grficos del mdulo y la imagen en dominio temporal son los siguientes. Filtro Pasa Bajo Dominio de la frecuencia Dominio Espacial

Siguiendo con la conclusin anterior, al dejar pasar las bajas frecuencias concentradas en el centro, es posible obtener una imagen entendible, donde se puede apreciar claramente que corresponde a la imagen original filtrada.

Parte 3: Reconstruccin

La reconstruccin de una imagen, mediante solamente la imagen se logra mediante el algoritmo representado por el siguiente diagrama de flujo.

Como imagen original, se tom vitral.jpg , a la cual se le aplico la fft2 de MATLAB, se guard la fase de la transformada y se procedi a escalarla a un 50% mediante e comando imresize . A continuacin se consider como imagen de partida una matriz random de las mismas dimensiones de la fase reducida. Luego se obtuvo la transformada de Fourier 2D a esta nueva imagen y se separ el mdulo de esta (modulo base para las iteraciones). Luego se procedi a multiplicar los valores de modulo y fase de la siguiente manera:

Luego de la multiplicacin, se aplic la ifft2 de MATLAB, para obtener la primera aproximacin del mdulo. Para seguir iterando, al resultado anterior se debe aplicar nuevamente la fft2 y almacenar el nuevo mdulo aproximado. Este nuevo mdulo ser multiplicado con la fase original, formando una nueva transformada hibrida, a la que a continuacin se le aplicara ifft2 y obtener una segunda aproximacin de la imagen. Este proceso puede realizarse tantas veces se estime conveniente, pero se llega a un punto en que por ms que se itere, las variaciones no son muy notorias. Los resultados obtenidos al aplicar este proceso son los siguientes: Imagen original: vitral.jpg Dimensiones:242x242 pixeles

Grfico de frecuencias de imagen original: Dimensiones :242x242 pixeles Observaciones: Se puede apreciar que gran parte de las frecuencias se encuentran situadas en el centro, sin embargo tambin existen componentes fuertes de altas frecuencias, a diferencia de lo que se vea en la imagen lena.bmp Grfico de fase de la imagen original: Dimensiones: 121x121

Imagen reconstruida: Dimensin: 121x121 Iteraciones :1000 Observaciones: al reducir la fase a un 50%, se pierde demasiada informacin como para poder reconstruir la imagen de una forma que se pueda apreciar en parte la imagen original. Esto viene a recalcar lo visto en clases, donde se mencion la importancia de la fase incluso por sobre el modulo.

Ejemplos anexos Se realizaron dos ejemplos extras para una mejor visualizacin de la parte del filtrado y de la reconstruccin. 1) Ejemplo extra de filtrado: Se utiliz la imagen vitral.jpg, ya que por sus caractersticas (por ser un vitral), tiene cambios bruscos en las intensidades de sus colores, por ende se pueden apreciar los filtrados de altas y bajas frecuencias de una mejor manera. Se utiliz un filtro cuadrado de 26x26. Los resultados se muestran a continuacin.

FIG. vitral.jpg original Filtro Pasa Alto Dominio de la frecuencia Dominio Espacial

Filtro Pasa Bajo Dominio de la frecuencia Dominio Espacial

2) Ejemplo extra sobre reconstruccin de imagen a partir de la fase: A modo de comprobar el buen funcionamiento del algoritmo programado, y de recalcar la importancia de la informacin almacenada en la fase, es que se desarrolla en mismo proceso de recuperacin de imagen, solo que en esta ocasin no se reducir el tamao de la fase, por ende no hay perdida de informacin en ese sentido. Los resultados fueron los siguientes: NOTA: solo se graficara la fase y a imagen reconstruida, ya que las otras imgenes se mantienen igual. Grfico de fase de la imagen original: Dimensiones: 242x242

Imagen reconstruida: Dimensin: 242x242 Iteraciones :100

Conclusiones Durante el desarrollo del informe, se puede dimensionar de forma real., como afecta la implementacin de un algoritmo u otro, especficamente el en tiempo y cantidad de clculos necesarios, para obtener un resultado similar. Estos algoritmos optimizados como la FFT generan un importante ahorro de recursos. Mediante diferentes pruebas a imgenes, se pudieron reforzar conceptos como: bajas y altas frecuencias, modulo y fase, filtros, dominio temporal y espacial. Obteniendo nuevas luces sobre la importancia de algunos de estos.

Referencias 1-Apuntes de Computacin Cientfica: http://arantxa.ii.uam.es/~pedro/ccii/teoria/Fourier/Fourier.htm 2-FFT Qu es realmente?: http://mchouza.wordpress.com/2009/05/14/fft-que-es-realmente/ 3-Tratamiento de seales: http://poseidon.tel.uva.es/~carlos/ltif10001/p2.pdf

4-Procesamiento Digital de Imgenes_Clase3.pdf, Profesor Gabriel Hermosilla.

Anexo Cdigos de los Script Script 1: transformada discreta de Fourier 2D algoritmo original
clc %Se limpia Comand Window clear all %Se borran las variables anteriormente declaradas close all %Se cierran todas las ventanas im=imread('lena.bmp'); %Se ingresa la imagen de prueba 1 debe estar en la carpeta im=rgb2gray(im);% Se transforma la imagen de RGB a escala de intensidades de gris im=imresize(im,[100 100]);%Se modifican las dimensiones de a imagen a 100X100 im=im2double(im);% se transforma la imagen de datos del tipo uint8 a double [fil,col]=size(im);% se guardan en variables las dimensiones de la imagen tstart=tic; %El comando tic inicia un contador al ejecutarse c1=0; for l=0:1:col-1% K2-1 for k=0:1:fil-1%K1-1 for x=0:1:fil-1%contador para la sumatoria de n1=0 a N1-1 for y=0:1:col-1%contador para la sumatoria n2=0 a N2-1 n1=x+1;n2=y+1;%Ya que la imagen no posee pixeles 0,0 se %debe partir desde 1 c=(1/(fil*col))*im(n1,n2) * exp(-1i*2*pi*(k*x/fil + l*y/col)); %cada termino corresponde a un n1 y n2 fijo c1=c1+c;%sumo todos los componentes para lograr la %transformada de un pixel end end %Al terminar de recorrer toda la imagen im, recien se tiene, la %transformada de un pixel(K1 y K2 fijos), valor que se guarda en la %matriz X k2=l+1;k1=k+1;%Ya que las matrices no poseen coordenadas 0,0 se suma 1. X(k1,k2)=c1;%almaceno la transformada de cada pixel en la imagen %final de la transformada c1=0;%seteo en cero c1 para realizar la transformada del pixel siguiente end end telapsed=toc(tstart);%detengo el contador iniciado con tic

X=fftshift(X);%ordeno las componentes de frecuencia (baja al centro y altas %a los bordes modulo=abs(X); fase=angle(X); figure,imshow(log((fil*col).*modulo+1),[])%Muestro la imagen de la transformada figure,imshow(fase,[]) Xrec=(fil*col).*fftshift(X);%"desordeno" nuevamente las componentes de frecuencia Xrec=abs(ifft2(Xrec));%se aplica la transformada rapida inversa de fourier %aplico abs ya que el resultado lo considera como variables complejas, a %pesar de que la parte imaginaria son solo ceros, lo cual era una %dificultad para poder mostrar la imagen recuperada. figure,imshow(uint8(Xrec),[]);%muestro la imagen recuperada disp(['El tiempo total de transformacion en segundos, fue de: ' num2str(telapsed)]);

Script 2: Trans. Discreta de Fourier 2D, descomposicin fila-columna

clear all %Se borran todas las variables close all %Se cierran todas las ventanas clc %Se limpia comand windod tstart=tic; %Se inicia el reloj im=imread('lena.bmp'); %Se ingresa la imagen de prueba 1 im=rgb2gray(im); %Se transforma la imagen de RGB a escala de intensidades de gris im=imresize(im,[100 100]); %Se modifican las dimensiones de a imagen a 100X100 im=im2double(im); %se transforma la imagen de datos del tipo uint8 a double [fil,col]=size(im); %se guardan en variables las dimensiones de la imagen tstart=tic; %Se inicia el reloj c1=0; d1=0; for l=0:1:col-1;%K2-1 for k=0:1:fil-1;%k1 for y=0:1:col-1;%n2-1 for x=0:1:fil-1;%n1-1 n1=x+1;n2=y+1; % Variables para recorrer la imagen im. c=im(n1,n2)*exp(-1i*2*pi*(k*x/fil)); %Calculos referentes a las filas, dependen de K1 y n1 c1=c1+c; %sumo todos los valores fila (todos los n1) para un k1 %fijo y un n2 fijo end k1=k+1; f(k1,n2)=(1/fil)*c1; %almaceno los datos FILA en una nueva matriz f, %esta matriz posteriormente se multiplicara con los calculos %correspondientes a las columnas. d=f(k1,n2)*exp(-1i*2*pi*(l*y/fil));%Calculos columna y multiplicacion %con la matriz f d1=d1+d; %Se suman todos los resultados obtenidos para todos los n2, %con K2 fijo y K1 fijo. c1=0;

end k2=l+1; X3(k1,k2)=(1/col)*d1;%almaceno los datos de la suma anterior, segun el K1 y K2 %al que corresponda la suma, de esta manera se llena la matriz de la %transformada de la imagen. d1=0;

end end telapsed=toc(tstart);%detengo el contador X3=fftshift(X3);%ordeno las componentes de frecuencia de la imagen modulo=abs(X3); fase=angle(X3); figure,imshow(log((fil*col).*modulo+1),[])%Muestro la imagen de la transformada figure,imshow(fase,[]) Xrec=(fil*col).*fftshift(X3);%desordeno las componentes de frecuencia de la imagen Xrec=abs(ifft2(Xrec));%se aplica la transformada rapida inversa de fourier %aplico abs ya que el resultado lo considera como variables complejas, a %pesar de que la parte imaginaria son solo ceros, lo cual era una %dificultad para poder mostrar la imagen recuperada. figure,imshow(uint8(Xrec),[]);%muestro la imagen recuperada disp(['El tiempo total de transformacion en segundos, fue de: ' num2str(telapsed)]);

Script 3: Filtrado de imagen

clear all %Se borran todas las variables close all %Se cierran todas las ventanas clc %Se limpia comand windod im=imread('lena.bmp'); %Se ingresa la imagen lena.bmp o vitral.jpg %im=imresize(im,[242 242]);%esta parte se utilizo para hacer que la imagen %vitral fuera cuadrada im=rgb2gray(im); %Se transforma la imagen de RGB a escala de intensidades de gris figure,imshow(im,[]); im=im2double(im); [fil,col]=size(im); tamanhofiltro=13;%aca se fija el "radio" del filtro partiendo desde el origen filtroinferior=(fil/2)-tamanhofiltro; filtrosuperior=(fil/2)+tamanhofiltro; X=fft2(im); X=fftshift(X); filtroPA=ones(fil); filtroPA(filtroinferior:filtrosuperior,filtroinferior:filtrosuperior)=0;% filtro pasa altos Xhigh=X.*filtroPA; figure,imshow(log(abs(Xhigh)+1),[]) XHighRest=fftshift(Xhigh); XHighRest=abs(ifft2(XHighRest)); figure,imshow(uint8(XHighRest),[]) filtroPB=not(filtroPA);%filtro pasabajo es el inverso del pasa altos en este caso Xlow=X.*filtroPB; figure,imshow(log(abs(Xlow)+1),[]) XLowRest=fftshift(Xlow); XLowRest=abs(ifft2(XLowRest)); figure,imshow(uint8(XLowRest),[]);

Script 4: Reconstruccin de imagen a partir de la fase

clear all %Se borran todas las variables close all %Se cierran todas las ventanas clc %Se limpia comand windod im=imread('vitral.jpg'); %Se ingresa la imagen de prueba im=imresize(im,[242 242]); im=rgb2gray(im); %Se transforma la imagen de RGB a escala de intensidades de gris figure,imshow(im,[]); im=im2double(im); X=fft2(im); X=fftshift(X); figure,imshow(log(abs(X)+1),[]) fase=fftshift(X);%desordeno la transformada fase=angle(fase);%separo la fase fase=imresize(fase,0.5);% disminuyo la fase a a mitad, pierdo la mitad de la informacion %si no disminuyo la fase es posible encontrar la imagen rapidamente a unas %5o iteraciones figure,imshow(fase,[]) fase=exp(j.*fase); dim=size(fase); modulo=abs(fft2(rand(dim))); for i=1:100;%numero de iteraciones imrec=modulo.*fase;%fase original por modulo rand imrec=ifft2(imrec);%aplico transformada inversa imrec=fft2(imrec);%aplico transformada nuevamente modulo=abs(imrec);%recupero modulo aproximado end imrec=modulo.*fase; imrec=abs(ifft2(imrec)); figure,imshow(uint8(imrec),[])