en una aplicación determinada Aplico una máscara promediadora para ingresar imágenes para reducir el ruido, y luego una máscara laplaciana para mejorar los pequeños detalles. ¿Alguien sabe si obtendría los mismos resultados si invierto el orden de estas operaciones en Matlab?máscara promedio y máscara laplaciana en el procesamiento de imágenes
Respuesta
Convolving con un núcleo Laplaciano es similar a usar información de segunda derivada sobre los cambios de intensidad. Como esta derivada es sensible al ruido, con frecuencia suavizamos la imagen con un gaussiano antes de aplicar el filtro laplaciano.
Aquí está un ejemplo de MATLAB similar a lo que @belisarius colocado:
f='http://upload.wikimedia.org/wikipedia/commons/f/f4/Noise_salt_and_pepper.png';
I = imread(f);
kAvg = fspecial('average',[5 5]);
kLap = fspecial('laplacian',0.2);
lapMask = @(I) imsubtract(I,imfilter(I,kLap));
subplot(131), imshow(I)
subplot(132), imshow(imfilter(lapMask(I),kAvg))
subplot(133), imshow(lapMask(imfilter(I,kAvg)))
Numéricamente los resultados no son los mismos, pero las imágenes se ven bastante similares.
Ejemplo en Mathematica:
Editar
Como respuesta a @thron comentario en su respuesta acerca de la conmutación de filtros lineales y el relleno, basta con considerar las siguientes operaciones.
Mientras que la conmutación de un filtro gaussiano y laplaciano sin relleno es cierto:
list = {1, 3, 5, 7, 5, 3, 1};
gauss[x_] := GaussianFilter[ x, 1]
lapl[x_] := LaplacianFilter[x, 1]
Print[gauss[lapl[list]], lapl[gauss[list]]]
(*
->{5.15139,0.568439,-1.13688,-9.16589,-1.13688,0.568439,5.15139}
{5.15139,0.568439,-1.13688,-9.16589,-1.13688,0.568439,5.15139}
*)
Hacer lo mismo con el acolchado, dan como resultado una diferencia en los bordes:
gauss[x_] := GaussianFilter[ x, 1, Padding -> 1]
lapl[x_] := LaplacianFilter[x, 1, Padding -> 1]
Print[gauss[lapl[list]], lapl[gauss[list]]]
(*
->{4.68233,0.568439,-1.13688,-9.16589,-1.13688,0.568439,4.68233}
{4.58295,0.568439,-1.13688,-9.16589,-1.13688,0.568439,4.58295}
*)
Digamos que tiene dos filtros F1
y F2
, y una imagen I
. Si pasa su imagen a través de los dos filtros, se llega a una respuesta que se define como
X = ((I * F1) * F2)
Donde aquí estoy usando *
para representar convolution.
Por la regla asociativa de convolución, esto es lo mismo que.
X = (I * (F1 * F2))
usando conmutatividad, podemos decir que
X = (I * (F2 * F1)) = ((I * F2) * F1)
Por supuesto, esto es en el buen dominio continuo de matemáticas, hacer estas cosas en una máquina significa que habrá errores de redondeo y algunos datos pueden estar perdido. También debe pensar si sus filtros son FIR, de lo contrario, todo el concepto de pensar en el filtrado digital como convolución comienza a desmoronarse ya que su filtro no puede comportarse como usted lo deseaba.
EDITAR
La convolución discreta se define como
por lo que añadir ceros en los bordes de ustedes de datos no cambia nada en un sentido matemático.
Como han señalado algunas personas, obtendrás diferentes respuestas numéricamente, pero esto se espera cada vez que trabajamos con el cálculo de datos reales. Estas variaciones deben ser pequeñas y estar limitadas a los componentes de baja energía de la salida de la convolución (es decir, los bordes).
También es importante considerar cómo está funcionando la operación de convolución. La aplicación de dos conjuntos de datos de longitud X
y longitud Y
dará como resultado una respuesta que es X+Y-1
de longitud. Hay algunos detrás de la magia detrás de escenas para programas como MATLAB y Mathematica para darle una respuesta que es de longitud X
o Y
.
Por lo que respecta a la publicación de @belisarius, parecería que realmente estamos diciendo lo mismo.
muy bien hecho gracias! – Glove
La aplicación de filtros de imagen generalmente requiere algo de relleno (particularmente ajustado para cada filtro, dependiendo de los valores en el límite de la imagen). Y eso rompe la propiedad de conmutación. –
@belisarius No estoy seguro de estar siguiendo cómo el relleno (cero o de otro modo) rompería la propiedad conmutativa para la convolución. ¿Puedes proporcionar una prueba? –
- 1. if (máscara y VALOR) o si ((máscara y VALOR) == VALOR)?
- 2. recorte escalable máscara
- 3. máscara de recorte vml
- 4. Superposición de máscara en UIScrollView
- 5. Máscara de degradado en UIView
- 6. Máscara para BackgroundSubtractorMOG2
- 7. Máscara Cadena con caracteres
- 8. Establecer la máscara alfa BufferedImage en Java
- 9. WPF Editar máscara
- 10. CSS3 apoyo -moz-máscara
- 11. pregunta de máscara de bits?
- 12. Máscara de Heroku e ip
- 13. problema máscara cálculo de subred
- 14. Promedio ponderado de vértices originales en la máscara de subdivisión de un bucle
- 15. lienzo html5 usa la imagen como máscara
- 16. OpenGL - máscara con múltiples texturas
- 17. Oracle to_date function. Máscara necesaria
- 18. máscara de imagen transparente en css overflow
- 19. Aplicar máscara a una cadena
- 20. Carácter opcional en la máscara de entrada
- 21. máscara de red a CIDR en rubí
- 22. Agregar una máscara con CALayers
- 23. Búsqueda por máscara de bits en ActiveRecord
- 24. HTML/CSS - crear máscara alfa sobre imagen
- 25. máscara de tiempo de entrada usando jquery
- 26. ¿Existe una máscara de sistema de archivos?
- 27. PHP debug_backtrace uso de máscara de bits
- 28. Cómo crear propia máscara en ios
- 29. UITableView rendimiento de desplazamiento con CALayer + máscara
- 30. Animación principal Animación de máscara CALayer
NIZA ¡Gracias! Entonces, ¿qué pasó cuando se revertieron los procedimientos? – Glove
@biz: 'thron of three' lo explicó bien, refiérase a su respuesta – Amro