Un desenfoque de caja (también conocido como filtro lineal de caja) es un filtro lineal de dominio espacial en el que cada píxel de la imagen resultante tiene un valor igual al valor promedio de sus píxeles vecinos en la imagen de entrada. Es una forma de filtro de paso bajo ("desenfoque"). Un desenfoque de caja de 3 por 3 ("radio 1") se puede escribir como matriz
Debido a su propiedad de utilizar pesos iguales, se puede implementar utilizando un algoritmo de acumulación mucho más simple, que es significativamente más rápido que utilizar un algoritmo de ventana deslizante. [1]
Los desenfoques de caja se utilizan con frecuencia para aproximar un desenfoque gaussiano . [2] Según el teorema del límite central , la aplicación repetida de un desenfoque de caja aproximará un desenfoque gaussiano. [3]
En el dominio de frecuencia , un desenfoque de cuadro tiene ceros y componentes negativos. Es decir, una onda sinusoidal con un período igual al tamaño del cuadro se desenfocará por completo y las longitudes de onda más cortas que el tamaño del cuadro pueden tener una fase invertida, como se ve cuando dos círculos de bokeh se tocan para formar un punto brillante donde habría un punto oscuro entre dos puntos brillantes en la imagen original.
Extensiones
Gwosdek et al. han ampliado el desenfoque de caja para que adopte un radio fraccionario: los bordes del filtro 1-D se expanden con una fracción. Esto permite una aproximación gaussiana ligeramente mejor debido a la eliminación del error de redondeo de números enteros. [3]
Mario Klingemann tiene un "desenfoque de pila" que intenta emular mejor el aspecto de Gauss en una sola pasada apilando pesos: [4] [5] La respuesta de impulso triangular que forma se descompone en dos rondas de desenfoque de caja. [3]
La imagen integral apilada de Bhatia et al. toma el promedio ponderado de algunos desenfoques de cuadros para ajustar la curva de respuesta gaussiana. [3]
Implementación
El siguiente pseudocódigo implementa un desenfoque de cuadro de 3x3.
Desenfoque de cuadro (imagen){ establecer newImage a imagen; Para x /*fila*/, y/*columna*/ en newImage haga lo siguiente: { //¡El kernel no encajaría! Si x < 1 o y < 1 o x + 1 == ancho o y + 1 == alto entonces: Continuar; // Establezca P en el promedio de 9 píxeles: XXX XPX XXX // Calcular el promedio. Suma = imagen[x - 1, y + 1] + // Arriba a la izquierda imagen[x + 0, y + 1] + // Centro superior imagen[x + 1, y + 1] + // Arriba a la derecha imagen[x - 1, y + 0] + // Centro izquierda imagen[x + 0, y + 0] + // Píxel actual imagen[x + 1, y + 0] + // Mitad derecha imagen[x - 1, y - 1] + // Abajo a la izquierda imagen[x + 0, y - 1] + // Centro bajo imagen[x + 1, y - 1]; // Abajo a la derecha nuevaImagen[x, y] = Suma / 9; } Devolver nuevaImagen;}
El ejemplo no maneja los bordes de la imagen, que no encajarían dentro del núcleo, de modo que estas áreas permanecen sin difuminar. En la práctica, el problema se maneja mejor de la siguiente manera: [3]
Introduciendo un canal alfa para representar la ausencia de colores;
Ampliando el límite rellenando valores, ordenados por calidad:
Rellena una imagen reflejada en el borde
Rellene con un color constante que se extienda desde el último píxel.
Almohadilla de color fijo
Se pueden aplicar varias optimizaciones al implementar el desenfoque de cuadro de un radio r y N píxeles: [6]
El desenfoque de caja es un filtro separable , de modo que solo se necesitarán dos pasadas 1D de promedio de 2 r + 1 píxeles, una horizontal y otra vertical, para cada píxel. Esto reduce la complejidad de O( Nr 2 ) a O( Nr ) . En la terminología de procesamiento de señales digitales, cada pasada es un filtro de promedio móvil .
Acumulación. En lugar de descartar la suma de cada píxel, el algoritmo reutiliza la suma anterior y la actualiza restando el píxel anterior y añadiendo el nuevo en el rango de desenfoque. Se puede utilizar una tabla de áreas sumadas de forma similar. Esto reduce la complejidad de O( Nr ) a O( N ) .
Cuando se utiliza en múltiples pasadas para aproximar un desenfoque gaussiano, la construcción del filtro peine-integrador en cascada permite realizar la operación equivalente en una sola pasada. [7]
^ Wojciech Jarosz. 2001. Convoluciones rápidas de imágenes.
^ Especificación W3C SVG1.1, 15.17 Primitiva de filtro 'feGaussianBlur'.
^ abcde Getreuer, Pascal (17 de diciembre de 2013). "Estudio de algoritmos de convolución gaussiana". Procesamiento de imágenes en línea . 3 : 286–310. doi : 10.5201/ipol.2013.87 .(código doc)
^ "Stackblur y Stackblur cuadrático". observablehq.com . 12 de noviembre de 2018.
^ "Cómo desenfocar una imagen en Android". Medium . 10 de febrero de 2020.
^ Kutsvir, Ivan. «Fastest Gaussian Blur (in linear time)» ( Desenfoque gaussiano más rápido (en tiempo lineal)) . Consultado el 4 de abril de 2020 .
^ Sitaker, Kragen. "Hmm, además de mi nota sobre cómo la familia de núcleos que descubrió Costella son precisamente los B-splines cardinales uniformes..." Hacker News .