26

Click here to load reader

Funciones en Matlab

Embed Size (px)

Citation preview

Page 1: Funciones en Matlab

Funciones en Matlab – Manejo de LUT´s –Técnicas Espaciales para elMejoramiento de Imágenes.

Laboratorio No. 2

Edna Cristina Cortés P. Cod: 2045255 Andrea Liliana Narváez. Cod: 2051107Giovanny A. Sánchez Cod: 2040984

I. INTRODUCCIÓN

El filtrado espacial es la operación que se aplica a una imagen para resaltar o atenuar detalles espaciales con el fin de mejorar la interpretación visual o facilitar un procesamiento posterior, y constituye una de las técnicas comprendidas dentro del realce de imágenes.Ejemplos comunes incluyen aplicar filtros para mejorar los detalles de bordes en imágenes, o para reducir o eliminar patrones de ruido. El filtrado espacial es una operación "local" en procesamiento de imagen, en el sentido de que modifica el valor de cada píxel de acuerdo con los valores de los píxeles que lo rodean; se trata de transformar los niveles de gris originales de tal forma que se parezcan o diferencien más de los correspondientes a los píxeles cercanos.

La frecuencia espacial define la magnitud de cambios en el nivel de gris por unidad de distancia en una determinada zona de la imagen. Las áreas de la imagen con pequeños cambios o con transiciones graduales en los valores de los datos se denominan áreas de bajas frecuencias. Las áreas de grandes cambios o rápidas transiciones se conocen como áreas de altas frecuencias (por ejemplo, los bordes).

Así, los filtros espaciales se pueden dividir en tres categorías:

- Filtros pasa bajos: enfatizan las bajas frecuencias, suavizando las imágenes y atenuando ruidos.

- Filtros pasa altos: enfatizan las altas frecuencias, para mejorar o afilar las características lineales como los límites en general.

- Filtro detectores de bordes: realizan otro tipo de operaciones con los píxeles, pero siempre con el resultado de enfatizar los bordes que rodean a un objeto en una imagen, para hacerlo más fácil de analizar.

II. OBJETIVOS

Conocer las características principales de funciones de Matlab para el Procesamiento Digital de imágenes.

Estudiar el mecanismo de creación y manipulación de funciones y subfunciones en Matlab.

Generación y manipulación de LUT´s para mejora de imágenes.

Page 2: Funciones en Matlab

Implementar diversas técnicas de mejoramiento de imágenes y realizar un estudio comparativo.

Aplicar los métodos de aumento del contraste, fraccionamiento de planos de bits, ecualización del histograma y mejora local a imágenes monocromáticas.

Apropiar las técnicas de diseño y aplicación de filtros digitales en el dominio espacial.

Analizar y comparar los efectos de los diferentes tipos de filtros espaciales en las imágenes digitales.

III. RESULTADOS Y ANÁLISIS

1. Generación de LUT’s. Implemente una función en Matlab que permita generar una LUT (tabla de asignación dinámica) para ser utilizada en el mejoramiento de imágenes monocromáticas. El programa debe recibir las coordenadas de varios puntos por donde debe pasar la función de transformación y el número de niveles de gris L. La función debe generar un vector (LUT) con todos los valores numéricos enteros entre 0 y L-1, y visualizar la gráfica r vs. s (nivel de entrada vs nivel de gris de salida) en una ventana. La función debe presentar el siguiente encabezado:

function [LUT] = MakeLUT (RS , L) donde, RS, vector de dos columnas que contiene los pares de coordenadas r y s de los puntos por donde pasa la función de transformación.L, Número de niveles de gris de la imagen.LUT, Vector resultante para aplicar la transformación.Consigne el código y explique el algoritmo utilizado.

[LUT]=makeLUT([50 80 ;100 256],256)

Fig. No 1. Tabla de Asignación Dinámica

Al generar una look up table lo que obtenemos es una transformación de tonos de gris que dependerán de los valores iniciales y condiciones en las que se generan las LUT.

En este caso obtenemos una LUT que tiene una pendiente diferente en intervalos que podemos variar cuando ingresamos los valores iniciales de nuestro vector.

Al generar la tabla lo que obtenemos es un vector de transformación que se puede aplicar a una imagen para resaltar ciertos niveles de gris y comprimir otros dependiendo del caso.

2. Aumento del contraste. Realice un programa en Matlab que lea una imagen, calcule su histograma, y permita introducir por teclado los parámetros de la función MakeLUT con el propósito de generar una LUT para aumentar el contraste sobre la imagen original. El programa debe visualizar en una misma ventana, las imágenes y los histogramas de entrada y de salida.Las imágenes resultantes deben almacenarse en archivos TIF. Consigne el código y explique el algoritmo utilizado.

Page 3: Funciones en Matlab

function prueba(imagen, RS, L) an = input ( ' Ingrese la imagen= '); disp ('Ejemplos de parametros para la Lut')disp ('[50 80;100 256]')disp ('[10 20;30 100]' )disp ('[10 20;30 100]' )disp (' O introduce los parametros que desees')RS = input('Ingrese los parametros de la make lut=');I=imread(an);[h,w] = size(I);[am Lm]= size (RS);L=256 T = makeLUT(RS,L); %Llama función lutic = I; for y =1:h-1 for x=1:w-1 r = I(y,x); ic(y,x)= T(r+1); endend figure;subplot(2,2,2);imhist(I);title('Histograma original');subplot(2,2,4);imhist(ic);title('Histograma modificado');subplot(2,2,1);imshow(I);title('Imagen original');subplot(2,2,3);imshow(ic);title('Imagen Modificada'); % se almacena la imagen modificada. imwrite(ic,strcat('I','figura_contrastada.tif'));

En este algoritmo el usuario introduce por teclado la imagen (se guarda en la variable an, se lee la imagen y se guarda en una variable I) que desea aumentar el contraste y los parámetros de la LUT (se guarda en la variable RS), luego se determina el tamaño de I y de RS, a continuación se llama la función makeLUT(RS,L) y se crea una variable ic donde esta guarda a I (la imagen original); con un ciclo for se recorre toda la matriz, en I (imagen original) empezamos en la posición (1,1) (digamos que el pixel es igual a 50) y

se carga en r, en la nueva matriz ic en la posición (1,1) va ser cargada con el valor de la transformación digamos que sea 51 (T(r+1)); y asi sucesivamente para cada pixel de la matriz hasta llenar todas las posiciones de la matriz ic (imagen modificada). Finalmente se muestran las imágenes (original y modificada) y los histogramas (original y modificado)

2.1. Pruebe el programa del numeral anterior para las imágenes bacteria.tif, moon.tif y saturn.tif.Para cada caso explique en qué se apoya para seleccionar la función de transformación (parámetros de MakeLUT) que permita mejorar el contraste.Consigne los resultados e indique que efectos se produce sobre la imagen.

Fig. No 2. Aumento de Contraste de la imagen Moon.tif

Fig. No 3. LUT de la imagen Moon.tif, con Parámetros [50 80; 100 256] ,256

Page 4: Funciones en Matlab

Fig. No 4. Aumento de Contraste de la imagen saturn.tif

Fig. No 5. LUT de la imagen saturn.tif, con Parámetros [10 20; 30 100] ,256

Fig. No 6. Aumento de Contraste de la imagen cell.tif

Fig. No 7. LUT de la imagen saturn.tif, con Parámetros [5 8; 10 20] ,256

Como se puede observar entre mas grande sean los valores de los parámetros de MakeLUT la imagen va a tener mayor contraste como se puede apreciar en la fig No 2. de la imagen moon; mientras que en la fig No 6. de la imagen de cell se puede observar que no hubo mucho cambio de contraste debido a que se utilizo valores muy pequeños en los parámetros de MakeLUT.3. Fraccionamiento de planos de bits. Realice un programa que tome una imagen y genere sus planos de bits. El programa debe verificar el número de bits por cada pixel (8 o 16) y visualizar los planos en ventanas gráficas diferentes por grupos. Consigne el código y explique el algoritmo utilizado.

clear, clc;close all;i=imread('tire.tif'); subplot(3,3,1)imshow(i);title('imagen original'); informacion=imfinfo('tire.tif'); bits = informacion.BitDepth;ancho= informacion.Width;altura= informacion.Height; Ngris=2^bits; i=double(i); for x=1:altura for y=1:ancho binario=dec2bin(i(x,y),8);

Page 5: Funciones en Matlab

doble=double(binario)-48; im1(x,y)=doble(1); im2(x,y)=doble(2); im3(x,y)=doble(3); im4(x,y)=doble(4); im5(x,y)=doble(5); im6(x,y)=doble(6); im7(x,y)=doble(7); im8(x,y)=doble(8); endend Subplot(3,3,2);imshow(logical(im8))title('Plano 1'); subplot(3,3,3);imshow(logical(im7));title('Plano 2'); subplot(3,3,4);imshow(logical(im6));title('Plano 3'); subplot(3,3,5);imshow(logical(im5));title('Plano 4'); subplot(3,3,6);imshow(logical(im4));title('Plano 5'); subplot(3,3,7);imshow(logical(im3));title('Plano 6'); subplot(3,3,8);imshow(logical(im2));title('Plano 7'); subplot(3,3,9);imshow(logical(im1));title('Plano 8');

Fig. No 8. Fraccionamiento de Bits de la imagen tire.tif

El algoritmo que utilizamos consiste en: primero leímos la imagen (tire.tif) y la guardamos en la variable i, luego mostramos la imagen, se hizo una lectura de datos a partir de la estructura (información) extrayendo toda la información de la imagen con el comando "imfinfo”, de esta información se determino el numero de bits de la imagen, el ancho y la altura, seguidamente determinamos los parámetros de la imagen, como la matriz de la imagen esta en uint8 se pasa a double, a continuación por medio de un ciclo ¨for¨ tomamos cada uno de los valores de los píxeles de la imagen, se pasan de decimal a binario para poderlos operar y como el numero debe ser de 8 bits, los que no tengan todos los valores se rellena con ceros, luego cada uno de estas 8 cifras binarias se guardan en variables separadas para poder fraccionar el plano de bits, finalmente mostramos los planos de bits.

3.1. Aplique el programa del numeral anterior a la imagen moon.tif y a su respectiva imagen mejorada (resultado de §2.1). Consigne y analice los resultados. Explique las diferencias encontradas.

Page 6: Funciones en Matlab

Fig. No 9. Fraccionamiento de Bits de la imagen moon.tif

Como se puede observar en ambas imágenes los planos de bits del 1 al 3 son muy borrosos, ya que no contienen información relevante de la imagen (bajas frecuencias). A partir de los planos 6 al 8 se puede apreciar el realce de los bordes, ya que estos planos son los que aportan mayor información de la imagen (altas frecuencias).

4. Ecualización del histograma. Implemente una función que tome una imagen y le aplique la técnica de ecualización del histograma. El programa debe visualizar en una misma ventana, las imágenes y los histogramas antes y después del tratamiento. La imagen resultante debe almacenarse en un archivo con el mismo formato de la imagen de entrada. Consigne el código y explique el algoritmo utilizado.

function prueba(archivo) x=imread('rice.png');[al an]=size(x); pix=0:255;acu=0;for s=0:255 for i=1:al for j=1:an if x(i,j)==s acu=acu+1; end end end

qq(1,(s+1))=acu; acu=0; end d=0;qqq=[]; for k=1:length(qq) d=qq(k)+d; qqq=[qqq d];endqqq=qqq./max(qqq); qqq=floor(255*qqq); T=qqq ;xecual=applyLUT(x,T); subplot(2,2,1); imshow(x); title('Imagen Original'); subplot(2,2,2); imhist(x) title('Histograma Imagen Original'); subplot(2,2,3); imshow(xecual); title('Imagen Ecualizada'); subplot(2,2,4); imhist(xecual) title('Histograma de la Imagen Ecualizada');

Para aplicar la técnica de ecualización a una imagen aplicamos una función donde, primero se lee la imagen y se guarda en una variable x, luego a partir de ciclos for anidados se calcula el histograma de la imagen, donde las variables i, j, recorren toda la matriz y si x(i, j) es igual a s (que va desde 0 hasta 255) se va acumulando (en una variable ¨acu¨ que se inicializa en cero y se le suma 1) es decir que se van contando el numero de pixeles iguales , finalmente el histograma queda guardado en la variable ¨qq¨; seguidamente a partir de un ciclo for calculamos el histograma acumulado (queda guardado en la variable ¨qqq¨), normalizamos el histograma, luego aplicamos el vector de transformación a la variable ¨qqq¨ y por ultimo se visualizan las imágenes con su histograma original y ecualizado.

Page 7: Funciones en Matlab

4.1. Pruebe el programa del numeral anterior con las imágenes tire.tif, saturn.tif y pout.tif. Consigne y analice los resultados. Explique el efecto obtenido en cada caso.

Fig No 10. Ecualización del Histograma de la imagen tire.tif

Fig No 11. Ecualización del Histograma de la imagen saturn.tif

Fig No 12. Ecualización del Histograma de la imagen pout.tif

Como podemos ir observando en las imágenes anteriores la ecualización de la imagen lo que genera aparte de un distribución del histograma de la imagen, hace que todos los valores sean parecidos (que las líneas sean del mismo alto), en el histograma original de las figuras 10 y 11 (Imágenes tire.tif y saturn.tif) se puede observar que éstas son muy oscuras, es decir, a la izquierda, al ecualizarlo no quedan las líneas del mismo tamaño en la distribución; en la figura 12 (imagen pout.tif) podemos apreciar que la imagen es gris y al ecualizar el histograma se nota una mejora de la imagen ya que los píxeles fueron mejores distribuidos logrando observar mejor algunos detalles que en la imagen original no se veían.

5. Especificación del histograma. Implemente una función que tome una imagen y le aplique la técnica de especificación del histograma. Para este caso, se considera que el histograma deseado presenta un comportamiento gaussiano centrado alrededor del valor L/2 (donde, L es la cantidad de niveles de gris) y que el usuario puede indicar la desviación estándar. El programa debe visualizar en una misma ventana, las imágenes y los histogramas antes y después del tratamiento. La imagen resultante debe almacenarse en un archivo con el mismo formato de la imagen de entrada. Consigne el código y explique el algoritmo utilizado.

R/ Algoritmo y su respectiva explicación

Especificación de histograma, consiste en modificar el nivel de intensidad de un píxel de la imagen a corregir mediante una transformación tal que el histograma de la imagen resultante

Page 8: Funciones en Matlab

presente un histograma similar al de la imagen de referencia. Cuando los histogramas son similares significa que el brillo medio, contraste y distribución de niveles de grises son también parecidos. Esta técnica funciona mejor mientras mayor sea el número de píxeles y, sobre todo, de niveles de grises.

function [fig,var]= Espec_Histog(img,desvi) % [fig,var]= Espec_Histog('tire.tif',50)% [fig,var]= Espec_Histog('saturn.png',50)

La parte del código anterior nos permite crear la función para que en el workspace la persona pueda variar los diferentes parámetros según la necesidad, su imagen y la desviación para la campana de gauss. i=imgread(img);informacion=imgfinfo(img);bits = informacion.BitDepth;Ancho= informacion.Width;Altura= informacion.Height;Ngris=2^bits;Lmin=0;Lmax=Ngris-1;imgshow(i); ib=histeq(i);his_ib= imghist(ib);figureplot(his_ib) a=1;Lmedio=Ngris/2;gauss=a*exp(-((([1:1:Ngris]-Lmedio)./desvi)).^2);Con el procedimiento anterior lo que hicimos fue la ecualización inversa lo que nos permite pasar de la imagen ecualizada a una nueva imagen cuyo histograma tiene la forma dada por el histograma deseado que se ha utilizado. k=histeq(i,camp);y=imhist(k);

Con la función histeq la imagen queda automáticamente ecualizada y se puede observar la imagen con una distribución de niveles de gris mucho mas uniforme

y en algunos casos puede ser beneficioso ya que la imagen se puede clarar u oscurecer según el caso.

subplot(3,3,1);imshow(i);title('Imagen original'); subplot(3,3,3);plot(his_ib);title('Histograma de la imagen'); subplot(3,3,5);plot(camp);title('Campana de Gauss (Histograma deseado)'); subplot(3,3,7);imshow(k);title('Especificacion de la imagen'); subplot(3,3,9);plot(y);title('Especificación del histograma');

Finalmente se visualizan las imágenes con sus respectivos tratamientos.

5.1. Pruebe el programa del numeral anterior con las imágenes tire.tif y saturn.tif. Consigne y analice los resultados. Explique el efecto obtenido en cada caso y las diferencias con el tratamiento presentado en los numerales §4.1.

Fig No 13. Especificación del histograma de la imagen tire.tif

Page 9: Funciones en Matlab

A veces con la ecualización no es suficiente para resaltar ciertos detalles de las imágenes que queremos observar mejor, para este caso se puede observar que cuando obtiene el histograma de la imagen ya ecualizada vemos que igual es una imagen de bajo contraste.

Como el histograma de forma de campana de Gauss se puede observa que tiene mas niveles claros de gris entonces cuando aplicamos este vector de transformación se puede ver que la imagen se aclara un poco y se pueden ver mas detalles.

Fig No 14. Especificación del histograma de la imagen saturn.tif

En este caso al aplicar el vector de transformación de la campana de Gauss a la imagen se puede observar que efectivamente el histograma de la imagen tomo la apariencia de la campana de Gauss, y se aclara un poco, permitiendo observar unos detalles que en la original no era permitido, pero también se pierden otros detalles que se pueden ver en la original, en lo posible se debe trabajar con las dos imágenes para tener una mejor interpretación de la misma.

6. Filtrado espacial

6.1. Máscaras. Realice una función en Matlab que permita aplicar una máscara

cuadrada de tamaño impar a una imagen digital. La función debe tener el siguiente formato:function [i_out] = fmask1 [i_in, mask, k ]

Consigne el código del programa y explique su algoritmo.

function [i_out]=fmask2(i_in,mask,k);clc; a=input('ingrese el tamaño de la mascara \ntamaño = '); if mod(a,2)==0; Flag = ' mascara de tamaño par, ingrese una de tamaño impar 3x3 5x5 7x7 9x9'return;end k=input('\ningrese el kernel\nkernel = '); for x=1:a for y=1:a mask1(x,y)=input('ingrese el valor= '); endend mask =1/(a^2)*mask1;im=imread('cameraman.tif'); A=double(im); [am Lm]= size (mask); [a L]= size (im);

Flag = ' mascara de tamaño impar continuando el proceso'P=zeros(a+am-1, L+Lm-1); limite=fix(am/2); for i=1:a; for j=1:L;P(i+limite,j+limite)=A(i,j); endendfor s=1:a; for S=1:L; for z=1:am; for x=1:Lm; I(z,x)=P(s+z-1,S+x-1)*mask(z,x); end end i_out1(s,S)=sum(sum(I)); endendi_out1=i_out1.*k; low=min(min(i_out1)); i_out1=i_out1-low; hi=max(max(i_out1)); m=255/hi;

Page 10: Funciones en Matlab

i_out=i_out1.*m; subplot(1,1,1);imshow(im);title('Imagen original');subplot(1,1,2);imshow(uint8(i_out));title('Imagen despues de tratamiento');

Fig No 15. Máscara Cuadrada de tamaño Impar de la imagen cameraman.tif

Con el código anterior lo que pudimos hacer fue implementar la convolución en forma matricial, el objetivo de aplicar mascaras a las imágenes es con el fin de hacer diferentes filtros para el mejoramiento de las imágenes, los diferentes filtros que se realicen dependen de los valores que contenga la matriz o mascara que se le aplique, en el anterior código se puede observar que el usuario es el que introduce los valores de la matriz, teniendo en cuenta que debe ser una matriz cuadrada e impar, para así asegurar un valor central, que es el principal para el procesamiento de la imagen, y también se debe tener en cuenta el valor de la variable K ya que es un valor que multiplica toda la matriz y esta se puede ver muy afectada por esta condición

En el código se observa que es necesario la creación de nuevas columnas y filas de ceros alrededor de la imagen original que depende de el tamaño de la mascara, y esto se debe hacer para evitar que esta opere con valores inexistentes, luego de las operaciones de multiplicación y suma sucesivas se puede ir generando la nueva imagen.

6.2. Imágenes de prueba. Genere un programa que tome una imagen y le adicione ruido aleatorio con parámetros especificados por el usuario. El programa debe visualizar las imágenes antes y después de modificadas indicando el tipo de ruido adicionado. La imagen resultante debe grabarse en un archivo .tif con un nombre indicado por el usuario.

Para generar el ruido utilice la función imnoise( ) de Matlab, con las opciones:gaussian, SALT & pepper, y speckle.

function ruido(i_in,tipo,k) i_in = input('Ingrese la imagen =');

disp('OPRIMA 1= RUIDO GAUSSIAN')disp('OPRIMA 2= SALT & PEPPER')disp('OPRIMA 3= RUIDO SPECKLE') tipo = input('Ingrese el tipo de ruido='); while tipo ~=1 & tipo ~=2 & tipo ~=3 disp('Opción Incorrecta') tipo = input('Ingrese el tipo de ruido=');endk = input('Ingrese k ='); I = imread(i_in); if tipo==1 disp(' selecciono ruido gaussian') J = imnoise(I,'gaussian', k); subplot (1,2,1) imshow(I) title ('Imagen Original') subplot (1,2,2) imshow(J) title ('Imagen con Ruido Gaussian')

elseif tipo==2 disp(' selecciono ruido salt & pepper') J = imnoise(I,'salt & pepper', k); subplot (1,2,1) imshow(I) title ('Imagen Original') subplot (1,2,2) imshow(J) title ('Imagen con Ruido Salt & Pepper')

elseif tipo==3 disp(' selecciono ruido speckle') J = imnoise(I,'speckle', k); subplot (1,2,1)

Page 11: Funciones en Matlab

imshow(I) title ('Imagen Original') subplot (1,2,2) imshow(J) title ('Imagen con Ruido Speckle')end

Fig No 16. Ruido Gaussian de la imagen eight.tif

Fig No 17. Ruido Salt & Pepper de la imagen eight.tif

Fig No 18. Ruido Speckle de la imagen eight.tif

Este algoritmo requiere de la entrada de datos por parte del usuario es por esto que se hace uso de function ruido (i_in, tipo, k), donde el usuario ingresa la imagen que desea observar (usando la función i_in), el tipo de ruido y el valor de k.

Para ingresar la imagen se usa el comando input y se guarda en la variable i_in. Posteriormente se le presenta al usuario un menú, donde tiene la opción de escoger el tipo de ruido que desea agregarle a la imagen, la opción 1 corresponde al Ruido “Gaussiano”, la opción 2 corresponde al Ruido “salt & pepper”, y la opción 3 corresponde al Ruido “speckle”; Si el usuario oprime una opción diferente a las anteriores le aparecerá un mensaje indicándole que la opción es incorrecta, esto se hace por medio del ciclo while. Luego el usuario ingresa el valor de k, el cual es diferente para cada ruido.

La función imnoise, permite convertir una imagen original a una imagen ruidosa agregándole ruido según el tipo y los parámetros especificados.

Finalmente se hace la visualización de la imagen original y la imagen con su respectivo ruido con el comando imshow.

6.3 Filtros de Alisamiento (Paso bajo). Genere una función para aplicar a una imagen un filtro promedio o un filtro mediana según selección del usuario en una ventana de diálogo. Pruebe el programa con las imágenes alumgrs.tif y pout.tif, y a sus respectivas imágenes con ruido.

function [i_out]=promedio (i_in,mask,k) im=imread('moon.tif' ); %leemos imagenA=double(im);[f,c]=size(A); disp('OPRIMA 1: filtro promedio')disp('OPRIMA 2: filtro mediana')tipo = input('Ingrese el tipo de filtro ='); % matriz qla mascara : mask=[0 1 0;1 1 1;0 1 0] while tipo ~=1 & tipo ~=2 disp('Opción Incorrecta') tipo = input('Ingrese el tipo de filtro=');end

Page 12: Funciones en Matlab

if tipo==1 for i=2:f-1 for j=2:c-1D(i,j)=sum(sum(A((i-1):(i+1),(j-1):(j+1))));D(i,j)=D(i,j)/9; end endelseif tipo==2 for i=2:f-1 for j=2:c-1 F(i,j)=median([A(i-1,(j-1):(j+1)) A(i,(j-1):(j+1)) A(i+1,(j-1):(j+1))]); end endend figuresubplot(1,2,1); imshow(uint8(A));title('Imagen Original');subplot(1,2,2); imshow(uint8(F)); if tipo==1 title('Imagen filtrada (promedio)');else title('Imagen filtrada (mediana)');endend

Fig No 19. Filtro de alisamiento (promedio) de la imagen pout.tif

Fig No 20. Filtro de alisamiento (Mediana) de la imagen

pout.tif

Fig No 21. Filtro de alisamiento (promedio) de la

imagen moon.tif

Fig No 22. Filtro de alisamiento (Mediana) de la imagen

moon.tif En el anterior algoritmo el usuario tiene opción de aplicar el tipo de filtro que desea, la opción 1 corresponde al filtro promedio, la opción 2 corresponde al filtro mediana, sí el usuario digita una opción diferente le aparecerá un mensaje indicándole que el la opción es incorrecta, esto se hace por medio del ciclo while.

Para el filtro promedio creamos una mascara 3X3 donde todos los coeficientes de las mascara son 1´s, luego la imagen completa se divide por 9 (o sea, por la suma de todos los coeficientes). Una aplicación importante de este tipo de filtrado es el borrocidad de la imagen.

Para el filtro mediana el algoritmo usado (2 ciclos for anidados) forma un vector, concatenando 3 filas de 3 elementos cada una que corresponde a una ventana de 3X3 de la matriz A, y

Page 13: Funciones en Matlab

luego se obtiene la mediana de ese vector por medio de la función de Matlab median.

Finalmente se realiza la visualización de dichas imágenes, ésta depende de la opción escogida por el usuario.

6.5 Filtros de Resalte (Paso alto). Utilizando la función fmask1, aplique las máscaras de realce indicadas a las imágenes alumgrns.tif y pout.tif, y a sus respectivas imágenes con ruido.

i. Filtro Paso Alto Básicoii. High-boost

function [i_out]=fmask1 (ima_in,mask,k) k = input('Ingrese k ='); ima_in = input('Ingrese la imagen ='); mask = input('Ingrese la mascara ='); im=imread(ima_in); A=double(im); [am Lm]= size (mask); [a L]= size (im);

if mod(am,2)==0 Flag = ' mascara de tamaño par ingrese una de tamaño impar 3x3 5x5 7x7 9x9' return;end Flag = ' mascara de tamaño impar'P=zeros(a+am-1, L+Lm-1); limite=fix(am/2);

for i=1:a; for j=1:L; P(i+limite,j+limite)=A(i,j); endend for s=1:a; for S=1:L; for z=1:am; for x=1:Lm; I(z,x)=P(s+z-1,S+x-1)*mask(z,x); end end i_out1(s,S)=sum(sum(I)); endendi_out=i_out1.*k; i_out1=i_out1-low;

hi=max(max(i_out1)); m=255/hi; i_out=i_out1.*m; subplot(1,2,1)imshow(im);title('Imagen original');subplot(1,2,2)imshow(uint8(i_out));title('Imagen después de tratamiento');

Utilizando la “fmask1” se implemento un programa con el cual se realizó un filtro pasa alto, se declara una variable “im” donde se almacena la imagen que deseamos procesar, verificamos las dimensiones de la mascara y de la imagen; posteriormente, se comprueba que la matriz que ingrese el usuario a través de la interfaz gráfica sea de tamaño par y en caso contrario se presentan banderas. Por otra parte, creamos una matriz de ceros “P” que va desde ancho hasta ancho-1, y de largo hasta largo-1, a fin de evitar que cuando sea recorrida la imagen y se hagan las respectivas operaciones se presente un desbordamiento, de igual forma, hacemos otro ciclo “for” anidado para signar la matriz A en P y ejecutar la máscara que recorra toda la matriz. Finalmente, se realiza la visualización de la imagen original y la imagen modificada.

6.6. Consigne los resultados y efectúe un análisis comparativo de los resultados.Indique en que situaciones se puede desempeñar mejor cada filtro.

Fig No 23. Filtro Paso Alto Básico de la imagen pout.tif

Page 14: Funciones en Matlab

Fig No 24. Filtro High-boost de la imagen pout.tif

El objetivo de los filtros pasa alto es destacar los detalles finos de una imagen o intensificar detalles que han sido difuminados.En el filtro pasa alto básico, se utiliza una mascara la cual en su centro tiene un valor positivo y el resto son valores negativos, pero también elimina el termino de frecuencia cero (0) y esto lo que hace es reducir significativamente el contraste global. El resultado de este filtro implican de alguna forma desplazamiento o cambio de escala, para que el final los niveles de grises queden dentro del intervalo.

El filtro high-boost, lo que hace es multiplicar la imagen original por un factor de amplificación, y el resultado de aplicar este filtro es que la imagen se parezca mas a la original, con un grado relativo de mejora de los bordes, esto depende del valor del factor amplificación, si éste aumenta el fondo de la imagen se hace mas brillante. Lo malo de estos filtros es que intensifican el ruido, junto con las transiciones bruscas de la intensidad de la imagen.

6.7. Operador Gradiente. Realice un programa en Matlab que permita calcular la magnitud del gradiente de una imagen (El gradiente es un vector). La función debe recibir como parámetros de entrada la imagen a procesar y una cadena de caracteres

indicando el tipo de operador a aplicar (Sobel, Roberts, Prewitt). El programa debe visualizar en una misma ventana la imagen de entrada y de salida.También debe visualizarse el tipo de operador usado. Efectúe un ajuste automático al rango dinámico de las imágenes de salida para que su visualización sea la adecuada.Consigne el código del programa y explique su algoritmo. No debe utilizarse funciones de Matlab que hagan la totalidad de lo pedido.

function [i_out]=fmask1(i_in,mask,k);clc;k=1a=input('Seleccione el operador gradiente \n 1.Sobel \n 2.Roberts \n 3.Prewitt \n operador= ','s');b=input('Seleccione tipo de operador gradiente \n 1.tipo A \n 2.tipo B \n tipo= ','s');operador=str2num(a);tipo=str2num(b) if operador==1 if tipo==1 mask =1/9*[-1 -2 -1;0 0 0;1 2 1]; flag= ' selecciono operador gradiente sobel tipo 1' end if tipo==2 mask =1/9*[-1 0 1;-2 0 2;-1 0 1]; flag= ' selecciono operador gradiente sobel tipo 2' end end if operador==2 if tipo==1 mask =1/4*[1 0;0 -1]; flag= ' selecciono operador gradiente Roberts tipo 1' end if tipo==2 mask =1/4*[0 1;-1 0]; flag= ' selecciono operador gradiente Roberts tipo 2' endend if operador==3 if tipo==1 mask =1/9*[-1 -1 -1;0 0 0;1 1 1]; flag= ' selecciono operador gradiente Prewitt tipo 1'

Page 15: Funciones en Matlab

end if tipo==2 mask =1/9*[-1 0 1;-1 0 1;-1 0 1]; flag= ' selecciono operador gradiente Prewitt tipo 2' end end

im=imread('cameraman.tif'); A=double(im); [am Lm]= size (mask); [a L]= size (im); Flag = ' mascara de tamaño impar continuando el proceso'P=zeros(a+am-1, L+Lm-1); limite=fix(am/2); for i=1:a; for j=1:L;P(i+limite,j+limite)=A(i,j); endendfor s=1:a; for S=1:L; for z=1:am; for x=1:Lm; I(z,x)=P(s+z-1,S+x-1)*mask(z,x); end end i_out1(s,S)=sum(sum(I)); endend low=min(min(i_out1));if low<0 i_out1=i_out1-low;end low=min(min(i_out1)); i_out1=i_out1-low;hi=max(max(i_out1));m=255/hi;i_out=i_out1.*m; subplot(1,2,1); imshow(im); title('Imagen original'); subplot(1,2,2); imshow(uint8(i_out)); title('Imagen despues de tratamiento');

Para este algoritmo el usuario tiene la opción de escoger con cual operador y tipo de operador quiere trabajar, cada operador gradiente tiene dos tipos (tipo 1 y tipo 2), la opción 1 corresponde al operador ¨Sobel¨, opción 2 corresponde al operador ¨Roberts¨ y la opción 3 es el operador ¨Prewitt¨. El tipo para cada

operador ya esta definido, es decir que en éste no decidimos la mascara sino que ya esta predeterminada dependiendo de la opción que escoja el usuario y el kernel siempre será 1. Luego se hace una reducción del rango dinámico y finalmente es visualizada la imagen.

6.8. Aplique cada uno de los operadores gradiente a las imágenes ic.tif y alumgrns.tif, y a sus respectivas imágenes con ruido. Consigne los resultados y efectúe un análisis comparativo de los resultados. Indique en que situaciones se puede desempeñar mejor cada operador.

Fig No 25. Operador Sobel de la imagen cameraman.tif

Fig No 26. Operador Roberts de la imagen cameraman.tif

Page 16: Funciones en Matlab

Fig No 27. Operador Prewitt de la imagen cameraman.tif

Si se requiere hacer un filtrado para tener solo los contornos de la imagen como se muestra en el ejemplo antes utilizado, se puede usar esta función fácilmente, sin pensar en el algoritmo especifico para hacer la mascara para un filtro pasa alto. Los operadores de gradiente se obtienen al tomar el valor absoluto de la respuesta de dos mascaras y luego sumar ambos resultados con el fin de aumentar la nitidez de la imagen, siendo este un efecto contrario al promedio de píxeles que tiende a difuminar la imagen.

Podemos ver que cada uno de los operadores gradientes nos arrojan imágenes diferentes, pero las diferenciamos por que unas muestran los contornos más sobresalientes de forma mas clara y las imágenes parecieran ser superpuestas.

6.9. Operador Laplacian. Realice un programa en Matlab que permita el Laplacian de una imagen (El Laplacian es un escalar que puede ser positivo o negativo). La función debe recibir como parámetros de entrada la imagen a procesar y una cadena de caracteres para indicar cual de tres aproximaciones se debe aplicar. El programa debe visualizar en una misma ventana la imagen de entrada y de salida. También debe visualizarse el tipo de operador usado. Efectúe un ajuste automático al rango dinámico de las imágenes de salida para que su visualización sea la adecuada.Consigne el código del programa y explique su algoritmo. Pueden utilizarse funciones de Matlab que hagan la totalidad de lo pedido. (Por tiempo de ejecución).

function [i_out]=fmask1(i_in,mask,k);clc;

k=1a=input('Seleccione el operador Laplacian \n 1.Tipo 1 \n 2.tipo 2\n 3.tipo 3 \n Tipo= ','s');tipo=str2num(a);if tipo==1 mask =1*[0 1 0;1 -4 1;0 1 0]; disp=('selecciono operador Laplacian tipo 1') end if tipo==2 mask =1/2*[1 0 1;0 -4 0;1 0 1]; disp=(' selecciono operador Laplacian tipo 2')end if tipo==3 mask =1/6*[1 4 1;4 -20 4;1 4 1]; disp=(' selecciono operador Laplacian tipo 3') end

cr=input('ingrese la imagen: ')im=imread(cr);A=double(im);[am Lm]= size (mask); [a L]= size (im);

disp=(' mascara de tamaño impar continuando el proceso')P=zeros(a+am-1, L+Lm-1); limite=fix(am/2); for i=1:a; for j=1:L;P(i+limite,j+limite)=A(i,j); endendfor s=1:a; for S=1:L; for z=1:am; for x=1:Lm; I(z,x)=P(s+z-1,S+x-1)*mask(z,x); end end i_out1(s,S)=sum(sum(I)); end end i_out=i_out1.*k; low=min(min(i_out1)); i_out1=i_out1-low; hi=max(max(i_out1));m=255/hi;i_out=i_out1.*m; subplot(2,1,1); imshow(im); title('Imagen original'); subplot(2,1,2); imshow(uint8(i_out)); title('Imagen despues de tratamiento');

Page 17: Funciones en Matlab

Con el código anterior implementamos los filtros Laplacianos o detección de bordes lo que hace este código es derivar la imagen y detectar todo los píxeles que tienen un cruce por cero, en realidad este tipo de filtro se utiliza para verificar si un píxel esta en la zona clara u oscura de una imagen, ya que en la detección de bordes puede producir un segundo borde al original debido a que es muy susceptible al ruido.

Al implementar el Laplaciano 1, 2 o 3 lo que estamos variando es la matiz que recorrerá la imagen, y dependiendo de esta tendrá en cuenta la vecindad 4 u 8, y se debe tener en cuenta que este tipo de filtrado como es una derivada la sumatoria de los valores de la matriz debe ser siempre cero, en general es un método no efectivo en la detección de bordes, ya que se ve afectado por el ruido.

En la primera parte del código se puede observar que la matriz cambia según lo desea el usuario, y este puede escoger los 3 tipos de Laplacianos que existen, ya la parte siguiente del código es la implementación de la mascara y su recorrido por la imagen.

6.10. Aplique cada uno de los operadores laplacian a las imágenes ic.tif y alumgrns.tif, y a sus respectivas imágenes con ruido. Consigne los resultados y efectúe un análisis comparativo de los resultados. Indique en que situaciones se puede desempeñar mejor cada operador.

Fig No 28. Operador Laplacian tipo 1 de la imagen rice.tif

Aquí podemos observar un filtrado laplaciano 1 el cual solo tiene en cuenta los vecinos 4, se resaltan los bordes pero no es muy clara la imagen ya que aclara muy poco las zonas oscuras.

Fig No 29. Operador Laplacian tipo 2 de la imagen cell.tif

En el tipo 2 se puede observar que los bordes se resaltan mucho mas, a pesar que la imagen tiene una distribución de pixeles recargado.

Fig No 30. Operador Laplacian tipo 3 de la imagen tire.tif

Al modificar los valores de la matriz aumentando los coeficientes sin alterar

Page 18: Funciones en Matlab

la suma igual a cero se puede observar que hay mas realce de bordes, este método es el mas efectivo entre los 3.

CONCLUSIÓN

El fraccionamiento de planos de bits es muy útil cuando una imagen es muy pesada y se desea comprimir, al hacer el fraccionamiento obtenemos que los bits mas significativos son los que tiene la mayor información sobre la imagen, de acuerdo a la fig No. 9 se puede construir la imagen a partir de los cuatro últimos planos.

De la practica podemos concluir que para diseñar un algoritmo que genere los planos de bits de una imagen, hay que tener en cuenta que lo que se hace es comprimir la imagen y mejorar el contraste, entonces esto fue un proceso muy sencillo ya que se toma cada uno de los valores de los píxeles de la imagen, pasarlos de decimal a binario para poderlos operar y como el numero debe ser de 8 bits entonces estas 8 cifras binarias las guarda en variables separadas para poder fraccionar el plano de bits. Este procesamiento de imágenes mejora el aspecto de las imágenes y hace más evidente en ellas ciertos detalles que se desean hacer notar.

La técnica de especificación de histograma nos permite que una imagen pueda tener la apariencia de una imagen deseada, en las figuras No.13 y la figura No.14 el histograma deseado es la campana de Gauss la cual podemos modificar su varianza y así obtener un histograma mejor distribuido.

Las mascaras son de gran utilidad ya que nos proporcionan una herramienta en el proceso de hacer convolución en imágenes para generar filtros y así hacer un mejoramiento de la imagen o resaltar detalles, pero hay que tener mucho cuidado en la implementación de estas, ya que no se puede aplicar mascaras de diferentes tamaños sin tener en cuenta la generación de nuevas filas y columnas de ceros que depende de la mascara.

El resultado de aplicar un filtro pasabajos a una imagen es simplemente el promediado de los píxeles contenidos en el entorno de la máscara utilizada. generalmente éste se utiliza para atenuar los detalles irrelevantes en una imagen. Otra de las utilidades del filtro pasabajos, es el suavizado de los falsos contornos producidos por una cuantización con un número insuficiente de niveles de gris.

Los filtros o derivadas Laplacianas, puede ser de gran utilidad para la detección de bordes, pero no es la mas efectiva, ya que depende de que tanto ruido tenga la imagen ya que este tipo de filtros son muy susceptibles a esos cambios, pero son efectivos para determinar si un píxel esta en zona clara o no.