stringtranslate.com

Desenfoque de cuadro

Un ejemplo de una imagen borrosa usando un desenfoque de cuadro

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

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]

Se pueden aplicar varias optimizaciones al implementar el desenfoque de cuadro de un radio r y N píxeles: [6]

  1. 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 .
  2. 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 ) .
  3. 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]

Véase también

Referencias

  1. ^ Wojciech Jarosz. 2001. Convoluciones rápidas de imágenes.
  2. ^ Especificación W3C SVG1.1, 15.17 Primitiva de filtro 'feGaussianBlur'.
  3. ^ 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)
  4. ^ "Stackblur y Stackblur cuadrático". observablehq.com . 12 de noviembre de 2018.
  5. ^ "Cómo desenfocar una imagen en Android". Medium . 10 de febrero de 2020.
  6. ^ Kutsvir, Ivan. «Fastest Gaussian Blur (in linear time)» ( Desenfoque gaussiano más rápido (en tiempo lineal)) . Consultado el 4 de abril de 2020 .
  7. ^ 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 .