Ruido y Filtrado Clase de Taller I del 28/10/2015 Índice RUIDO ¿Qué es el ruido? Objetivos. Tipos de ruido. TECNICAS DE FILTRADO EN DOMINIO ESPACIAL Promediado de imágenes Filtros de orden Filtros de medias DOMINIO FRECUENCIAL FUNCIONES EN MATLAB Problema. Las imágenes se adquieren por métodos foto electrónicos o fotoquímicos. Los dispositivos sensores tienden a degradar la calidad de las imágenes al introducir ruido, deformaciones geométricas y/o borrosas debido al movimiento o desenfoque del dispositivo con el que se obtiene la imagen (cámara). Una de las preocupaciones primarias del procesamiento digital de imágenes es aumentar la calidad de la imagen y moderar la degradación introducida por los sensores y dispositivos de adquisición. Las técnicas de restauración de imágenes están interesadas primariamente por reconstruir o recobrar una imagen que ha sido degradada. ¿Qué es el ruido? Repasemos: Imagen digital Objeto Real: continuo Representación Interna: Pixel dicreta Concepto de ruido (I) Cuando obtenemos una imagen digital y se ve un poco distorsionada, decimos que la imagen tiene ruido. ruido Según su definición, ruido es cualquier perturbación que sufre una señal en el proceso de adquisición y/o transmisión y/o almacenamiento. El ruido se modela usualmente como un proceso estocástico (modelo probabilístico). Concepto de ruido (II) El ruido es un defecto de la información no deseado que contamina/degrada la imagen. Se manifestará generalmente en píxeles aislados que toman valores distintos de los “reales”. Imagen real Degradación Imagen distorsionada + f(x,y) g(x,y) D + n(x,y) Imágenes ruidosas Escáner de la letra “G” con y sin ruído >>[R,Q] = size(G); % matriz 5x7 >>G_ruidosa = G + randn(R,Q)*0.2 G=01110100011000010000100111000101110 G_ruidosa = 0.1337 0.9859 1.0447 1.0773 -0.5392 1.0712 0.0547 0.0860 -0.0817 0.9028 0.6783 0.0299 0.3474 -0.0147 0.1335 1.2666 0.0991 0.3885 -0.2928 0.1002 1.0181 -0.0948 0.0390 0.8881 0.9455 0.8147 0.0208 0.4779 0.1484 1.2493 -0.2367 0.9407 1.0204 1.0842 -0.2981 Objetivos: procesamiento de ruido Suavizar la imagen: imagen reducir las variaciones de intensidad entre píxeles vecinos. Eliminar ruido: ruido modificar aquellos píxeles cuyo nivel de intensidad es muy diferente del de sus vecinos. Realzar la imagen: imagen aumentar las variaciones de intensidad, allí donde se producen. Detectar bordes: bordes detectar aquellos píxeles donde se produce un cambio brusco en la función intensidad. Tipos de ruidos Aditivo: El más usual es el gaussiano, que es esencialmente aditivo y la señal independiente, g(z,y) = f(z,y) + n(z,y) donde g(z,y) es el resultado de la distorsión de imagen original f(z,y) por el ruido gaussiano aditivo n(z,y) Impulsivo: Frecuentemente los sensores generan ruido impulsivo. Algunas veces el ruido generado por transmisión digital (o incluso analógico) es impulsivo. Puede ser modelado como: g(x,y)=(1-p)*f(x,y)+p*i(x,y) donde i(z, y) es el ruido impulsivo y p pertenece a {0,1}. Multiplicativo: el ruido de aspecto granulado de las imágenes de radares y ecografías. Es esencialmente multiplicativo. Tiene un aspecto moteado. g (z, y) = f (z, y) * m(x, y), donde m(z, y) es el ruido multiplicativo. Comando Matlab: J = IMNOISE(I,TYPE,...) Adisiona de los siguiente tipos: 'gaussian' Ruido Gausiano blanco con media y varianza cosntante. 'localvar' Ruido Gausiano Blanco con media cer y varianza. 'poisson' Ruido con distribución Poisson. 'salt & pepper' Cambia los pixeles a blanco o negro. 'speckle' Ruido Multiplicativo. Ruido Gaussiano (I) El valor final del píxel es el real más una cierta cantidad de error. Puede describirse como una variable gaussiana que sigue una distribución normal. • P(g(x,y)- < f(x,y) < g(x,y)+) = 70% • P(g(x,y)-2 < f(x,y) < g(x,y)+2 ) = 90% Ruido Gaussiano (II) Produce pequeñas variaciones en la imagen. Suele ser debido a los componentes electrónicos (sensores, digitalizadores...) Espectro de energía constante para todas las frecuencias: Afecta a la imagen completa. La intensidad de todos los píxeles se ve alterada. Ruido Gaussiano (III) Por ejemplo se suele asumir que en función del ruido Gaussiano el valor de la media es cero m(µ) y con un valor 0,01 de varianza. Se define ruido blanco como un proceso estocástico que presenta media nula, varianza constante y covarianza nula y si además la distribución es normal, se denomina Ruido Blanco Gaussiano. Los comandos que se usan para invocar a la función son: J= imnoise(I,‘gaussian’, m, v) Ruido Gaussiano (IV) Ejemplo: original v=0,01 v=0,1 Ruido Gaussiano (V) Influencia del ruido gausiano según la varianza: Ruido Impulsionar: “Sal y Pimienta” (I) El valor que toma el píxel no tiene relación con el valor real sino que toma valores muy altos o muy bajos Toma el valor máximo (sal) o el mínimo (pimienta). En Matlab el comando es: J= imnoise(I, ‘salt & pepper’,d) Añade el ruido a la imagen I donde d es la densidad del ruido. Se afecta aproximadamente a los d*num(I) pixeles. El valor de d por defecto es 0,05. Ruido Impulsionar: “Sal y Pimienta” (I) Ejemplos con d=0.1 y d=0.3: Ruido Impulsionar: “Sal y Pimienta” (II) Ejemplo: Ruido Multiplicativo (I) La señal obtenida es fruto de la multiplicación de dos señales. Se añade el ruido a la multiplicación de la imagen por medio de la siguiente ecuación: J=n*I Donde n es de distribución uniforme de ruido aleatorio con media 0 y con varianza v. El valor predeterminado en Matlab es de v = 0,04. La sintaxis para invocar a la función es: J= imnoise(I, ‘speckle’,v) Ruido Uniforme (II) Ejemplo multiplicativo: Mejoramiento de la imagen: Con el objetivo de mejorar la imagen a través de reducir o eliminar el ruido se suelen aplicar filtros. filtros La idea es aproximar el valor original del pixel usando información de la propia imagen o externa. Hay muchos tipos diferentes de filtros. Tipos de Filtros: Dominio Espacial Filtros de orden o Filtros de medias: Mediana Moda Máximos y mínimos o Promediado de imágenes Lineales • Media (paso bajo espacial) • Media geométrica • Media armónica • Media contra-armónico • De Gauss No lineales • Outlier Dominio Frecuencial Paso bajo Paso alto Paso banda Rechazo banda Filtros del Domino Espacial Estos filtros consisten en modificar o mejorar un pixel elegido en función de los valores de un entorno o subconjunto de pixeles vecinos a aquel. Vecindades Operaciones sobre vecindades: Son aquellas que se realizan sobre bloques definidos dentro de la imagen, en vez de procesar toda la imagen Operaciones basadas en vecindades (I) Las operaciones se realizan de la siguiente forma: 1.- Se selecciona el píxel a procesar. 2.- Se selecciona el entorno del píxel. 3.- Se aplica una función que depende del valor de los píxeles del entorno seleccionado. 4.- Se pone en la imagen de salida en la posición del píxel seleccionado de la imagen de entrada, el valor devuelto por la función. 5.- Repetir de 1 a 4 por cada píxel de la imagen de entrada. Operaciones basadas en vecindades (II) Solución: Relleno de píxeles Imagen de salida Imagen de entrada 1 1 n 2 3 4 2 3 . . m 5 1 2 3 1 ... 2 ... 3 ... 1 1 n ... ... 2 3 4 2 . . 3 m Rellenar contorno sin alterar la imagen original: 5 ... ... ... . . ... ... máscara= Función: imfilter (‘La_imagen.jpg’, máscara, relleno, salida) [0 0 0 0 0 00000 00100 ‘same’: Mismo tamaño imagen original 00000 ‘full’: Tamaño resultante con relleno (mayor) 0 0 0 0 0] Operaciones basadas en vecindades (III) Relleno de una constante f= 1 -1 1 -1 1 2 -2 2 -2 2 3 -3 3 -3 3 2 -2 2 -2 2 w= [0 0 0 0 0 00000 00100 00000 0 0 0 0 0] 1 -1 1 -1 1 >> imfilter(f,w,25,'full') Operaciones basadas en vecindades (IV) Relleno basado en réplica f= 1 -1 1 -1 1 2 -2 2 -2 2 3 -3 3 -3 3 2 -2 2 -2 2 w= [0 0 0 0 0 00000 00100 00000 0 0 0 0 0] 1 -1 1 -1 1 >> imfilter(f,w,’replicate' ,'full') Operaciones basadas en vecindades (V) Relleno basado en espejo f= 1 -1 1 -1 1 2 -2 2 -2 2 3 -3 3 -3 3 2 -2 2 -2 2 w= [0 0 0 0 0 00000 00100 00000 0 0 0 0 0] 1 -1 1 -1 1 >> imfilter(f,w,’ symmetric ‘,'full') Operaciones basadas en vecindades (VI) Tamaño imagen destino f= 1 -1 1 -1 1 2 -2 2 -2 2 3 -3 3 -3 3 2 -2 2 -2 2 1 -1 1 -1 1 >> imfilter(f,w,0,’ full') w= [0 0 0 0 0 00000 00100 00000 0 0 0 0 0] >> imfilter(f,w,0,’ same') Filtros de orden: Metodología: Definir tamaño de submatriz para actuar. Ordenar los elementos que engloban la submatriz. Aplicar el criterio correspondiente dependiendo del filtro. Tipos de ventanas: Preserva bordes Vert. y horizont. Preserva bordes oblicuos Filtros de orden: Debe fijarse un tamaño de vecindad. Puede ser rectangular o de cualquier otra forma, generalmente cuadrado y número de elementos impar. Debe definirse la posición del pixel de estudio respecto a la ventana, generalmente y por simetría el central. En una convolución las propiedades del filtro vienen dadas por los coeficientes de la máscara. Hay problemas de borde o contorno. Duplicación periódica. Duplicación del borde. Puesta a cero del contorno. Suprimir borde Filtrado de la mediana (I) Sustituye el valor del píxel estudiado, por la mediana de los valores que engloba una ventana de selección dada. Ventajas Atenúa el ruido impulsionar (Sal y pimienta). Elimina efectos engañosos. Preserva bordes de la imagen. Inconvenientes Pierde detalles (Puntos, líneas finas). Redondea las esquinas de los objetos. Desplazamiento de los bordes. Filtrado de la mediana (II) menor mayor Operaciones basadas en vecindades (I) Ejemplo: Mediana de una vecindad de 3x3 Imagen de entrada (I) Imagen de salida (I1) 0 10 10 6 3 0 11 14 15 10 5 3 11 15 16 6 4 2 11 13 10 5 3 2 6 14 10 10 4 3 11 16 17 20 6 3 11 20 15 10 5 4 13 16 6 2 2 2 11 16 7 3 4 2 6 7 4 3 2 2 6 4 4 2 3 2 0 4 3 3 2 0 Lo cual se realizaría con el siguiente programa Matlab >> I1=medfilt2(I,[N M]); % Default 3x3 Filtrado de la mediana (III) FILTRO DE LA MEDIANA PONDERADA: A menudo se ponderan mas ciertos valores de nivel de gris que otros y eso se ve reflejado en unas máscaras de ponderación. Por ejemplo, se le puede dar más importancia a los píxeles centrales que al resto de la ventana. Una máscara de ponderación muy común es : 1 2 1 2 4 2 1 2 1 Filtrado de la mediana (IV) 3 35 12 6 25 45 15 17 22 3 12 X 12 1 2 1 2 4 2 1 2 1 15 22 3 70 12 = 12 100 45 15 34 22 34 45 70 100 Filtrado de la moda Sustituye el píxel estudiado por el valor más repetido que contiene la ventana de selección. Ventaja Atenúa el ruido impulsional (Sal y pimienta). Inconveniente Con frecuencia los valores de intensidad en la vecindad son todos diferentes. Máximos y mínimos (I) Máximo: selecciona el mayor valor dentro de una ventana ordenada de valores de nivel de gris. Ventaja Elimina el ruido pimienta (píxeles negros). Inconvenientes Sólo funciona cuando el ruido es tipo pimienta. Tiende a aclarar la imagen. Operaciones basadas en vecindades (II) Ejemplo: Máximo de una vecindad de 3x3 Imagen de entrada (I) Imagen de salida (I1) 16 17 20 20 20 6 20 20 20 20 20 6 20 20 20 20 20 6 20 20 20 15 10 5 6 14 10 10 4 3 11 16 17 20 6 3 11 20 15 10 5 4 13 16 6 2 2 2 11 16 7 3 4 2 16 16 16 7 4 4 6 4 4 2 3 2 16 16 16 7 4 4 Lo cual se realizaría con el siguiente programa Matlab >> f=inline('max(x(:))'); % Define función máxima >> I1=nlfilter(I,[3, 3],f); % Devuelve máximo Máximos y mínimos (II) Mínimo: Selecciona el menor valor de dentro de una ventana ordenada de valores de píxeles. Ventaja Elimina el ruido sal (píxeles blancos). Inconvenientes Sólo funciona cuando el ruido es tipo sal. Tiende a oscurecer la imagen. Operaciones basadas en vecindades (III) Ejemplo: Mínimo de una vecindad de 3x3 Imagen de entrada (I) Imagen de salida (I1) 6 14 10 10 4 3 0 0 0 0 0 0 11 16 17 20 6 3 0 6 10 4 3 0 11 20 15 10 5 4 0 6 2 2 2 0 13 16 6 2 2 2 0 6 2 2 2 0 11 16 7 3 4 2 0 4 2 2 2 0 6 4 4 2 3 2 0 0 0 0 0 0 Lo cual se realizaría con el siguiente programa Matlab >> f=inline('min(x(:))'); >> I1=nlfilter(I,[3, 3],f); Máximos y mínimos (III) Filtros de media Lineales (I) Filtros de media Lineales (II) Filtros de media Lineales (III) Filtro media lineal Obtiene el valor promedio de los pixeles. También se denomina filtro de media. Su efecto es el difuminado o suavizado de la imagen y se aplica junto con el de mediana para eliminar ruidos. 1/9 * 1 1 1 1 1 1 1 1 1 Este filtro se puede implementar con la siguiente máscara(kernel) para un tamaño 3x3: Esta configuración recibe el nombre de media aritmética Filtro media aritmética Ej. Filtro media aritmética Filtros de media Lineales (V) Paso bajo espaciales Se puede dar distintos pesos a los valores de los píxeles Mayor peso al central. Máscara: 1/9 * 1 1 1 1 2 1 1 1 1 Filtros de media Lineales (V) Paso bajo espaciales Mayor peso al píxel central que a sus vecinos, y a los vecinos de tipo cuatro que a los de tipo 8. Máscara: 1/9 * 1 b 1 b b2 b 1 b 1 Este filtro no logra eliminar el ruido impulsionar Generación de Filtros en Matlab h = fspecial(type) h = fspecial(type, parameters) Crea un filtro bidimensional h del tipo especificado. Devuelve como un kernel de correlación, que es la forma adecuada para usar con imfilter. Filtros espaciales Responden a la siguiente ecuación: g ( x, y) a b w ( s, t ) f ( x s, y t ) s at b donde: f(x+s, y+t): Valor de los píxeles del bloque seleccionado w(s, t): Coeficientes que se aplicarán al bloque (máscara) Siendo la matriz del bloque: m(filas) = 2a + 1 n(columnas) = 2b + 1 Filtros espaciales (II) Concepto: Son las operaciones que se realizan directamente sobre los píxeles. Se define una matriz de coeficientes del filtro (o máscara, de tamaño mxn) los cuales constituirán pesos ponderados por los que se multiplicarán los valores originales de los píxeles. Filtros espaciales (III) Valores de los píxeles del bloque f(x-1, y-1) f(x-1, y) f(x-1, y+1) f(x, y-1) f(x+1, y-1) f(x, y) f(x+1, y) f(x, y+1) f(x+1, y+1) Valores de los píxeles de los coeficientes (máscara) w(-1, -1) w(-1, 0) w(-1, 1) w(0, -1) w(0, 0) w(0, 1) w(1, -1) w(1, 0) w(1, 1) g ( x, y) a b w ( s, t ) f ( x s, y t ) s at b Filtros espaciales (IV) Ejemplo: Valor de los píxeles 17 23 4 10 11 Máscara (o filtro) 24 1 8 15 5 7 14 16 6 13 20 22 12 19 21 3 18 25 2 9 g ( x, y) a 8 3 4 1 5 9 6 7 2 b w ( s, t ) f ( x s, y t ) s at b g(2,4)=1(8)+8(1)+15(6)+7(3)+14(5)+16(7)+13(4)+20(9)+22(2)=585 Filtros espaciales (V) Pasos para la aplicación del filtro lineal: 1.- Definir la máscara 2.- Definir tipo de relleno 3.- Aplicar la ecuación: g ( x, y) a b w ( s, t ) f ( x s, y t ) s at b 4.- Definir tamaño de la imagen de salida Filtros espaciales (VI) Ejemplos de filtros Filtro promedio: Filtro promedio ponderado: Filtros espaciales (VII) Ejemplo (usando Matlab): % Imagen original >> I=imread('tire.tif'); % Se define una matriz de pesos de valores iguales, % a lo que se le denomina filtro promedio >> w=ones(5,5)/25; % Se aplica el filtro >> I2=imfilter(I,w); Original >> I(1:5,1:5) ans = 6 14 10 11 16 17 11 20 15 13 16 6 11 16 7 10 4 20 6 10 5 2 2 3 4 Resultado >> I2(1:5,1:5) ans = 5 6 7 6 6 8 9 7 8 9 10 9 7 8 9 8 6 6 7 6 5 5 6 5 4 Filtro promedio Es muy efectivo en remover ruido blanco aditivo Gaussiano. Sin embargo, tiende a hacer borrosos los bordes y los detalles de la imagen (por ejemplo líneas) y degrada la calidad de la imagen. Filtros espaciales (VIII) Original Con ruido Filtros espaciales (IX) Original >> imhist(I) >> imhist(I2) 900 800 800 700 700 600 600 500 500 400 400 300 300 200 200 100 100 0 0 0 50 100 150 200 250 0 50 100 150 200 250 Filtros espaciales (X) Formas de aplicar la máscara Método de correlación: Se aplica la máscara tal y como se define. Método de convolución: Se rota la máscara 180 grados alrededor del píxel central, antes de aplicar el filtro. Imagen f= 00000 00000 00100 00000 00000 Máscara w= 123 456 789 >> imfilter(f,w,'corr') >> imfilter(f,w,'conv') Filtro Laplaciano Este tipo de filtro se basa en un operador derivativo, por lo que acentúa las zonas que tienen gran discontinuidad en la imagen f ( x) f ( x 1) f ( x) x Filtro Laplaciano (II) Si se cumple: Entonces: f ( x) f ( x 1) f ( x) x 2 f ( x) f ( x 1) f ( x 1) 2 f ( x) 2 x Si la función depende de dos variables 2 2 f ( x , y ) f ( x, y ) 2 f ( x, y ) 2 x y 2 Filtro Laplaciano (III) Función dependiente de dos variables 2 2 f ( x , y ) f ( x, y ) 2 f ( x, y ) 2 x y 2 La derivada de segundo orden con respecto a al variable x: 2 f ( x, y ) f ( x 1, y ) f ( x 1, y ) 2 f ( x, y ) 2 x De forma similar, con respecto a y: 2 f ( x, y ) f ( x, y 1) f ( x, y 1) 2 f ( x, y ) 2 y Finalmente: 2 f ( x, y ) f ( x 1, y ) f ( x 1, y ) 2 f ( x, y ) f ( x, y 1) f ( x, y 1) 2 f ( x, y ) Filtro Laplaciano (IV) El Laplaciano queda definido por: 2 f ( x, y ) f ( x 1, y ) f ( x 1, y ) f ( x, y 1) f ( x, y 1) 4 f ( x, y ) La anterior expresión es equivalente a aplicar una máscara definida por: w= 0 1 0 1 -4 1 0 1 0 g ( x, y) a b w ( s, t ) f ( x s, y t ) s at b Filtro Laplaciano (V) % Imagen original >> I=imread('moon.jpg' ); % Se define una matriz de pesos >> w=[0, 1, 0; 1, -4, 1; 0, 1, 0]; % Se aplica el filtro >> I2=imfilter(I,w); Alternativa: >> I=imread('moon.jpg '); >> w=fspecial('laplacian',0); >> I2=imfilter(I,w,'replicate'); Filtro Laplaciano (VI) Imágenes: www.imageprecessingplace.com Filtro Laplaciano (VII) 2 f ( x, y ) f ( x 1, y ) f ( x 1, y ) f ( x, y 1) f ( x, y 1) 4 f ( x, y ) Si se desea considerar las variaciones con respecto a la diagonal w= 0 1 0 1 -4 1 w= 1 1 1 0 1 0 -4 +1 1 -8 1 1 1 1 También se utiliza el negado de las anteriores máscaras w= -1 -1 -1 w= -1 8 -1 -1 -1 -1 0 -1 0 -1 4 -1 0 -1 0 Filtros Laplacianos alternativos Se emplea en pocas ocasiones en la práctica Excesivamente sensible a la presencia de ruido Da lugar a bordes dobles y no permite determinar direcciones Se utiliza para realzar una imagen Sumar o restar el Laplaciano de la imagen dependiendo del signo del coeficiente central de la máscara utilizada Coeficiente central de la máscara negativo Coeficiente central de la máscara positivo Filtros Laplacianos alternativos (II) Resultado de sustraer el Laplaciano (una única máscara) Incluye diagonal MatLab: Resumen Introducción de ruido: Gaussiano: Gaussiano Ruidosa = imnoise(imagen,’gaussian’,”media”,”varianza”) Por defecto: media=0 varianza=0.01 Ruidosa = imnoise(imagen, 'localvar',”varianza”) Por defecto: media=0 varianza=0.01 Permite definir la varianza de cada píxel por separado Impulsional: Impulsional Ruidosa = imnoise(imagen, 'salt & pepper' ,”media”,”varianza”) Multiplicativo: Multiplicativo Ruidosa = imnoise(imagen, 'speckle',”media”,”varianza”) Matlab Filtrado: Mediana: Máximo: Filtrada = ordfilt2 (Imagen,1,ones(tamaño de ventana)) Media aritmética: Filtrada = ordfilt2 (Imagen,9,ones(tamaño de ventana)) Mínimo: Filtrada = medfilt2(Imagen,[tamaño de ventana]) Por defecto: ventana = 3 x 3 Filtrada = imfilter (Imagen,fspecial(‘average’,[tamaño de ventana])) Por defecto: ventana = 3 x 3 Gaussiano: Filtrada = imfilter (Imagen,fspecial(‘gaussian’,[tamaño de ventana],varianza)) Por defecto: ventana = 3 x 3 Generación de Filtros en Matlab h = fspecial(type) h = fspecial(type, parameters) Crea un filtro bidimensional h del tipo especificado. Devuelve como un kernel de correlación, que es la forma adecuada para usar con imfilter. Filtro Gaussiano (I) La máscara o filtro que responde a: w( x, y ) e a ( x 2 y 2 ) / 4 2 b e ( s 2 t 2 ) / 4 2 s a s b Siendo la matriz del bloque: m(filas) = 2a + 1 n(columnas) = 2b + 1 ó Filtro Gaussiano (II) Influencia del parámetro Filtro Gaussiano (III) Máscara a partir de función no lineal Filtro que se aplica es lineal 0.25 %Define máscara >> fspecial('gaussian',3,0.5) ans = 0.0113 0.0838 0.0113 0.0838 0.6193 0.0838 0.0113 0.0838 0.0113 0.2 0.15 0.1 0.05 0 -3 -2 -1 0 1 0.0478 0.1163 0.0478 0.1163 0.2829 0.1163 0.0478 0.1163 0.0478 2 3 % Máscara y filtro >> w=fspecial(‘gaussian',3,0.5); >> I2=imfilter(I,w,'replicate'); g ( x, y) a b w ( s, t ) f ( x s, y t ) s at b Laplaciana de la gausiana Laplaciana de la gausiana (II) >> w=fspecial('log',5,0.4) ans = 0.2475 0.2475 0.2479 0.2475 0.2475 0.3545 1.2336 0.3545 0.2479 1.2336 -10.31 1.2336 0.2475 0.3545 1.2336 0.3545 0.2475 0.2475 0.2479 0.2475 >>surf(w) 5 15 0 10 -5 5 -10 0 -15 5 -5 5 4 3 2 t 1 1 3 2 s 4 5 0.2475 0.2475 0.2479 0.2475 0.2475 >>surf(-w) 4 3 2 t 1 1 3 2 s 4 5 Laplaciana de la gausiana (III) Mejorando detalles del tipo de filtros >> w=fspecial('log',5,0.4) >> [x, y]=meshgrid(-2:1:2) >> [xi, yi]=meshgrid(-2:.05:2); >> zi = interp2(x,y,z,xi,yi); >> surf(xi,yi,zi) 5 0 -5 -10 -15 5 4 3 2 t 1 1 3 2 s 4 5 Máscaras con fspecial Disco >> w = fspecial('disk',4) Promedio >> w = fspecial('average',5) w= 0.0400 0.0400 0.0400 0.0400 0.0400 >> 1/25 ans = 0.0400 0.0400 0.0400 0.0400 0.0400 0.0400 0.0400 0.0400 0.0400 0.0400 0.0400 0.0400 0.0400 0.0400 0.0400 0.0400 0.0400 0.0400 0.0400 0.0400 0.0400 Ejemplo: Promedio >> w=fspecial('average'); Imagen Original Resultado del Filtro Máscaras con fspecial (II) Gausiana >>z = fspecial('gaussian',5,0.7) Laplaciana de la gausiana >> z = fspecial('log',5,0.7) Ejemplo: Filtro Gaussiano >> w=fspecial('gaussian'); Imagen Original Resultado del Filtro Máscaras con fspecial (III) Laplaciana >>z = z = fspecial('laplacian',0.3) >> fspecial('laplacian',0) 0 1 0 1 -4 1 0 1 0 Mejora de contraste >> z = fspecial('unsharp',0.3) >> fspecial('unsharp',0) 0 -1 0 -1 5 -1 0 -1 0 Filtro para acentuar contraste >> w=fspecial('unsharp'); Imagen Original Resultado del Filtro Máscaras con fspecial (IV) Acentuar transiciones horizontales y verticales Prewit: Acentuar transiciones horizontales Máscara: w = [1 1 1 0 0 0 -1 -1 -1] Sobel: Acentuar transiciones horizontales Máscara: w = [1 0 -1 2 0 -2 1 0 -1] Acentuar transiciones verticales: Transpuesta de la matriz Ejemplo: Filtro Prewit >> w=fspecial('prewitt'); Imagen Original Resultado del Filtro Ejemplo: Filtro Sobel >> w=fspecial('sobel'); >> hp=transp(w); % Acentúa vertical Imagen Original Resultado del Filtro Filtros no lineales Filtro lineal g ( x, y) a b w ( s, t ) f ( x s, y t ) s at b Filtro no lineal Valor de los píxeles 17 24 1 8 15 23 5 7 14 16 4 6 13 20 22 10 12 19 21 3 11 18 25 2 9 Aplicación Bloque de píxeles 1 1 1 1 1 1 1 1 1 >>B = nlfilter(A, [m n], función_nl) Supresión de ruído Ejemplo de aplicación de filtro no lineal Sea: -Sxy La región de la imagen -(x,y) Centro de la región - f’(x,y) La salida del filtro (escalar) Filtro de Media aritmética ˆf ( x, y ) 1 g ( s, t ) mn ( s ,t )S xy A = imread(‘imagen.jpg'); fun = @(x) mean(x(:)); B = nlfilter(A,[3 3],fun); A= 1 4 7 2 5 8 3 6 9 B= 1.3333 3.0000 2.6667 2.3333 5.0000 4.3333 1.7778 3.6667 3.1111 Filtros no lineales (II) Ejemplo de Filtro de Media aritmética Imagen original Media aritmética Filtros no lineales (III) Filtro de Media geométrica fˆ ( x, y ) g ( s, t ) ( s ,t )S xy 1 mn Filtro de Media armónica fˆ ( x, y ) mn ( s ,t )S xy 1 g ( s, t ) Función spfilt: Gonzáles, R.; Woods, R.; Eddins, S.: Digital Image Processing Using Matlab. 2004 Filtros no lineales (IV) Ejemplo de Filtro de Media geométrica (I2=spfilt(I, 'gmean', 3, 3);) Imagen original Media geométrica Filtros no lineales (V) Ejemplo de Filtro de Media armónica >> I2=uint8(3*3./imfilter(1./I, ones(3, 3), 'symmetric')) Imagen original Media harmónico Filtros no lineales (VI) Filtro de Media Contra-armónica Q 1 g ( s , t ) fˆ ( x, y ) ( s ,t )S xy Q g ( s , t ) ( s ,t )S xy Filtro de Punto medio ˆf ( x, y ) 1 max{g ( s, t )} min{g ( s, t )} 2 Filtros no lineales (VII) Ejemplo de Filtro de Media Contra-armónica (I2=spfilt(I, 'chmean‘,3, 3);) Imagen original Media contraharmónico Filtros no lineales (VIII) Ejemplo de Filtro de Punto medio >> d1=ordfilt2(I, 1, ones(3, 3), 'symmetric'); % Mínimo >> d2=ordfilt2(I, 3*3, ones(3, 3), 'symmetric'); % Máximo >> I1=uint8(1/2*(d2+d1)); Imagen original Punto medio ¿Cuál filtro utilizar? Verificar como se difuminan los bordes después de aplicar el filtro >>I=imread('contornos.tif'); % Se determinan los bordes verticales >> II=edge(I, 'sobel', 'vertical'); imshow(II) ¿Cuál filtro utilizar? (II) % Se aplica ruido a la imagen >> III=imnoise(I,'salt & pepper',0.005); % Se aplica el filtro mediana y se detectan bordes verticales >> IV=medfilt2(III); >> V=edge(IV, 'sobel', 'vertical'); imshow(V) ¿Cuál filtro utilizar? (III) % Se aplica el filtro promedio y se detectan bordes verticales >>w=fspecial('average'); >>VI=uint8(imfilter(III, w, 'symmetric')); >> VII=edge(VI, 'sobel', 'vertical'); imshow(VII) % Se aplica el filtro media armónica y se detectan bordes verticales >> VIII=uint8(3*3./imfilter(1./III, ones(3, 3), 'symmetric')); >>IX=edge(VIII, 'sobel', 'vertical'); imshow(IX) Resultado % Se aplica el filtro punto medio %y se detectan bordes verticales >> d1=ordfilt2(III, 1, ones(3, 3), 'symmetric'); >> d2=ordfilt2(III, 3*3, ones(3, 3), 'symmetric'); >> X=uint8(1/2*(d2+d1)); >>XI=edge(X, 'sobel', 'vertical'); imshow(XI) Calidad por siguiente orden: Mediana Promedio Punto medio Media armónica Frente a ruido: Sal y Pimienta