Un cuadro de desenfoque (también conocido como filtro lineal de cuadro) es un filtro lineal de dominio espacial en el que cada píxel de la imagen resultante tiene un valor igual al valor medio de sus píxeles vecinos en la imagen de entrada. Es una forma de filtro de paso bajo ("difuminado"). Un cuadro de desenfoque de 3 por 3 ("radio 1") se puede escribir como matriz
Debido a su propiedad de usar pesos iguales, se puede implementar usando un algoritmo de acumulación mucho más simple, que es significativamente más rápido que usar un algoritmo de ventana deslizante. [1]
Los desenfoques de cuadro se utilizan con frecuencia para aproximar un desenfoque gaussiano . [2] Según el teorema del límite central , la aplicación repetida de un cuadro borroso se aproximará a un desenfoque gaussiano. [3]
En el dominio de la frecuencia , un cuadro borroso tiene ceros y componentes negativos. Es decir, una onda sinusoidal con un período igual al tamaño de la caja se difuminará por completo, y las longitudes de onda más cortas que el tamaño de la caja se pueden invertir en fase, como se ve cuando dos círculos bokeh se tocan para formar un punto brillante habría un punto oscuro entre dos puntos brillantes en la imagen original.
Extensiones
- Gwosdek y col. ha ampliado el Desenfoque de cuadro para tomar un radio fraccional: los bordes del filtro 1-D se expanden con una fracción. Hace posible 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 pasada al apilar pesos:[4] [5] La respuesta de impulso triangular que forma se descompone en dos rondas de cuadro borroso. [3]
- Imagen integral apilada de Bhatia et al. toma el promedio ponderado de unos pocos recuadros desenfocados para ajustarse a la curva de respuesta gaussiana. [3]
Implementación
El siguiente pseudocódigo implementa un cuadro de desenfoque de 3x3.
Desenfoque de cuadro (imagen){ Declare newImage como una copia de la imagen; Para cada píxel (x, y) de la imagen, haga lo siguiente: { // ¡Kernel no encajaría! Si x <1 o y <1 o x + 1 == ancho o y + 1 == alto Continuar; // Establezca P en el promedio de 9 píxeles: XXX XPX XXX // Calcula el promedio. Suma = imagen [x - 1, y + 1] + // Arriba a la izquierda imagen [x + 0, y + 1] + // Centro superior image [x + 1, y + 1] + // Arriba a la derecha image [x - 1, y + 0] + // Medio a la izquierda image [x + 0, y + 0] + // Pixel actual image [x + 1, y + 0] + // Medio a la derecha image [x - 1, y - 1] + // Bajo a la izquierda imagen [x + 0, y - 1] + // Centro bajo imagen [x + 1, y - 1]; // Baja derecha nuevaImagen [x, y] = Suma / 9; } Devuelve newImage;}
El ejemplo no maneja los bordes de la imagen, que no cabrían dentro del kernel, por lo que estas áreas permanecen sin difuminar. En la práctica, el problema se maneja mejor mediante: [3]
- Introducción de un canal alfa para representar la ausencia de colores;
- Extendiendo el límite completando valores, clasificados por calidad:
- Rellena una imagen reflejada en el borde
- Rellene un color constante que se extienda desde el último píxel
- Almohadilla en un color fijo
Se pueden aplicar varias optimizaciones al implementar el desenfoque de cuadro de un radio r y N píxeles: [6]
- El cuadro de desenfoque es un filtro separable , por lo que solo se necesitarán dos pasadas 1D con un 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 paso es un filtro de media 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 antiguo y agregando el nuevo píxel en el rango de desenfoque. Una tabla de áreas sumadas se puede utilizar de manera 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 de peine-integrador en cascada permite realizar la operación equivalente en una sola pasada. [7]
Ver también
Referencias
- ^ Wojciech Jarosz. 2001. Convoluciones de imágenes rápidas .
- ^ Especificación W3C SVG1.1, 15.17 Primitiva de filtro 'feGaussianBlur' .
- ↑ a b c d e Getreuer, Pascal (17 de diciembre de 2013). "Una encuesta 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" . Medio . 10 de febrero de 2020.
- ^ Kutsvir, Ivan. "Desenfoque gaussiano más rápido (en tiempo lineal)" . Consultado el 4 de abril de 2020 .
- ^ Sitaker, Kragen. "Hmm, aparte de mi nota sobre cómo la familia de núcleos que Costella descubrió son precisamente los B-splines cardinales uniformes ..." Hacker News .