2. Vecindades Operaciones sobre vecindades: Son aquellas que se realizan sobre bloques definidos dentro de la imagen, en vez de procesar toda la imagen
3. Operaciones basadas en vecindades 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 altera el píxel de la imagen de salida equivalente al píxel de la imagen de entrada, por el valor devuelto por la función. 5.- Repetir de 1 a 4 por cada píxel de la imagen de entrada.
4. Operaciones basadas en vecindades (II) Ejemplo: Máximo de una vecindad de 3x3 Imagen de entrada (I) Imagen de salida (I1) 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 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 4 4 2 3 2 16 17 20 20 20 6 20 20 20 20 20 6 20 20 20 20 20 6 20 20 20 15 10 5 16 16 16 7 4 4 16 16 16 7 4 4
5. Operaciones basadas en vecindades (III) Ejemplo: Mínimo de una vecindad de 3x3 Imagen de entrada (I) Imagen de salida (I1) Lo cual se realizaría con el siguiente programa Matlab >> f=inline('min(x(:))'); >> I1=nlfilter(I,[3, 3],f); 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 4 4 2 3 2 0 0 0 0 0 0 0 6 10 4 3 0 0 6 2 2 2 0 0 6 2 2 2 0 0 4 2 2 2 0 0 0 0 0 0 0
22. Filtros espaciales (XI) 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 Formas de aplicar la máscara f = 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 w = 1 2 3 4 5 6 7 8 9 >> imfilter(f,w,'corr') >> imfilter(f,w,'conv') Imagen Máscara
23.
24.
25. Imágenes ruidosas (III) % Ruido gausiano >> s = 15; % Desviación estándar >> s = s/255; % Se normaliza a [0,1] >> II = imnoise(road,'gaussian',0,s^2); % media 0, varianza (15^2)
29. Supresión de ruido con filtro promedio IV=imnoise(I,'salt & pepper'); >> w=ones(3,3)/9; >> I2=imfilter(I,w);
30. 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, destacando detalles finos, bordes y discontinuidades
32. Filtro Laplaciano (III) Función dependiente de dos variables La derivada de segundo orden con respecto a al variable x: De forma similar, con respecto a y: Finalmente:
33. Filtro Laplaciano (IV) El Laplaciano queda definido por: La anterior expresión es equivalente a aplicar una máscara definida por: w = 0 1 0 1 -4 1 0 1 0
36. Filtro Laplaciano (VII) w = 0 1 0 1 -4 1 0 1 0 w = 1 1 1 1 -8 1 1 1 1 Si se desea considerar las variaciones con respecto a la diagonal +1 -4 w = -1 -1 -1 -1 8 -1 -1 -1 -1 También se utiliza el negado de las anteriores máscaras w = 0 -1 0 -1 4 -1 0 -1 0
43. Laplaciana de la gausiana (II) >> w=fspecial('log',5,0.4) ans = 0.2475 0.2475 0.2479 0.2475 0.2475 0.2475 0.3545 1.2336 0.3545 0.2475 0.2479 1.2336 -10.31 1.2336 0.2479 0.2475 0.3545 1.2336 0.3545 0.2475 0.2475 0.2475 0.2479 0.2475 0.2475 >>surf(w) >>surf(-w)
44. Laplaciana de la gausiana (III) >> 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) Mejorando detalles del tipo de filtros
45. Máscaras con fspecial >> w = fspecial('disk',4) Promedio >> w = fspecial('average',5) w = 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 0.0400 0.0400 0.0400 0.0400 >> 1/25 ans = 0.0400 Disco
54. Filtros no lineales Filtro lineal 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 Bloque de píxeles 1 1 1 1 1 1 1 1 1 >>B = nlfilter(A, [m n], función_nl) Aplicación Supresión de ruido
55. Ejemplo de aplicación de filtro no lineal Sea: - S xy 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 A = imread(‘imagen.jpg'); fun = @(x) mean(x(:)); B = nlfilter(A,[3 3],fun); A = 1 2 3 4 5 6 7 8 9 B = 1.3333 2.3333 1.7778 3.0000 5.0000 3.6667 2.6667 4.3333 3.1111
56. Ejemplo de Filtro de Media aritmética Filtros no lineales (II)
57. Filtro de Media geométrica Filtro de Media armónica Función spfilt : Gonzáles, R.; Woods, R.; Eddins, S.: Digital Image Processing Using Matlab . 2004 Filtros no lineales (III)
58. Ejemplo de Filtro de Media geométrica ( I2=spfilt(I, 'gmean', 3, 3); ) Filtros no lineales (IV)
59. Ejemplo de Filtro de Media armónica >> I2=uint8(3*3./imfilter(1./I, ones(3, 3), 'symmetric')) Filtros no lineales (V)
60. Filtro de Media Contra-armónica Filtro de Punto medio Filtros no lineales (VI) Filtro de máximo (aclara) Filtro de mínimo (oscurece)
61. Ejemplo de Filtro de Media Contra-armónica ( I2=spfilt(I, 'chmean‘,3, 3); ) Filtros no lineales (VII)
62. 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)); Filtros no lineales (VIII)
63. Filtro Mediana Filtros no lineales (IX) Valor de los píxeles 17 24 1 8 15 23 5 7 40 16 4 6 13 20 22 10 12 19 21 3 11 18 25 2 9 1.- Se ordenan 1 7 8 13 15 16 20 22 40 2.- Se selecciona el central 17 24 1 8 15 23 5 7 15 16 4 6 13 20 22 10 12 19 21 3 11 18 25 2 9 Número par de píxeles La media de los dos píxeles centrales
64. ¿Cuál filtro utilizar? >>I=imread( 'contornos.tif' ); % Se determinan los bordes verticales >> II=edge(I, 'sobel', 'vertical'); imshow(II) Verificar como se difuminan los bordes después de aplicar el filtro
65. ¿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)
66. ¿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)