Desenfoque gaussiano: desviación estándar, radio y tamaño de grano

19

He implementado un sombreador de fragmentos de desenfoque gaussiano en GLSL. Entiendo los conceptos principales detrás de todo: convolución, separación de x e y usando linealidad, múltiples pases para aumentar el radio ...

Sin embargo, todavía tengo algunas preguntas:

  • ¿Cuál es la relación entre sigma y radio?

    He leído que sigma es equivalente a radio, no veo cómo se expresa sigma en píxeles. ¿O es "radio" solo un nombre para sigma, no relacionado con píxeles?

  • ¿Cómo elijo sigma?

    Teniendo en cuenta que utilizo varios pases para aumentar sigma, ¿cómo elijo un buen sigma para obtener el sigma que quiero en cualquier pase? Si la sigma resultante es igual a la raíz cuadrada de la suma de los cuadrados de las sigmas y sigma es equivalente al radio, ¿cuál es una manera fácil de obtener el radio deseado?

  • ¿Cuál es el buen tamaño para un kernel y cómo se relaciona con sigma?

    He visto que la mayoría de las implementaciones usan un núcleo 5x5. Esta es probablemente una buena opción para una implementación rápida con una calidad decente, pero ¿hay alguna otra razón para elegir otro tamaño de kernel? ¿Cómo se relaciona Sigma con el tamaño del núcleo? ¿Debería encontrar la mejor sigma para que los coeficientes fuera de mi núcleo sean insignificantes y simplemente se normalicen?

Lode runner
fuente

Respuestas:

21

¿Cuál es la relación entre sigma y radio? He leído que sigma es equivalente a radio, no veo cómo se expresa sigma en píxeles. ¿O es "radio" solo un nombre para sigma, no relacionado con píxeles?

Hay tres cosas en juego aquí. La varianza, ( σ2 ), el radio y el número de píxeles. Como se trata de una función gaussiana bidimensional, tiene sentido hablar de la matriz de covarianza . Sea como fuere, sin embargo, esos tres conceptos están débilmente relacionados.Σ

En primer lugar, la gaussiana 2-D viene dada por la ecuación:

g(z)=1(2π)2|Σ|e12(zμ)TΣ1 (zμ)

Donde es un vector columna que contiene el y de coordenadas en la imagen. Entonces, , y es un vector de columna que codifica la media de su función gaussiana, en las direcciones e . x y z = [ x y ] μ x y μ = [ μ x μ y ]zxyz=[xy]μxyμ=[μxμy]

Ejemplo:

Ahora, digamos que establecemos la matriz de covarianza , y . También estableceré el número de píxeles en x . Además, mi 'cuadrícula', donde evalúo este PDF, irá de a , tanto en como en . Esto significa que tengo una resolución de cuadrícula de . Pero esto es completamente arbitrario. Con esa configuración, obtendré la imagen de función de densidad de probabilidad a la izquierda. Ahora, si cambio la 'varianza', (realmente, la covarianza), de modo queΣ=[1001]μ=[00]1001001010xy10(10)100=0.2Σ=[9009] y mantiene todo lo demás igual, obtengo la imagen a la derecha.

ingrese la descripción de la imagen aquí

El número de píxeles sigue siendo el mismo para ambos, x , pero cambiamos la varianza. Supongamos, en cambio, que hacemos el mismo experimento, pero usamos x píxeles, pero todavía corrí de a . Entonces, mi cuadrícula tiene una resolución de . Si uso las mismas covarianzas que antes, obtengo esto:1001002020101010(10)20=1

ingrese la descripción de la imagen aquí

Así es como debes entender la interacción entre esas variables. Si desea el código, también puedo publicarlo aquí.

¿Cómo elijo sigma?

La elección de la matriz de varianza / covarianza de su filtro gaussiano depende en gran medida de la aplicación. No hay respuesta correcta. Es como preguntar qué ancho de banda se debe elegir para un filtro. De nuevo, depende de su aplicación. Por lo general, desea elegir un filtro gaussiano de modo que anule una cantidad considerable de componentes de alta frecuencia en su imagen. Una cosa que puede hacer para obtener una buena medida es calcular el DFT 2D de su imagen y superponer sus coeficientes con su imagen gaussiana 2D. Esto le dirá qué coeficientes están siendo penalizados fuertemente.

Por ejemplo, si su imagen gaussiana tiene una covarianza tan amplia que abarca muchos coeficientes de alta frecuencia de su imagen, entonces debe hacer que sus elementos de covarianza sean más pequeños.

Tarin Ziyaee
fuente
1
Esas imágenes serían mejores si usaran un mapa de color secuencial. El jet es lo peor.
endolito el
@endolith "Mejor" depende de la aplicación. No uso jet cuando se necesita discriminación de contraste visual. (Caliente es mejor). Aquí, sin embargo, el mensaje está dentro del tamaño del gaussiano, por lo que no se hace daño con el jet. Gracias por el enlace sin embargo.
Tarin Ziyaee
2
¡Esta es una respuesta bien pensada y muy bien visualizada! Tome esa imagen superior izquierda, por ejemplo. Está claro que esa combinación de varianza y tamaño del núcleo sería un desperdicio, ya que es un núcleo de 100x100 donde solo el centro 30x30 (~ 9%) no es cero.
Adam Smith
5

El parámetro sigma es suficiente para definir el desenfoque gaussiano desde un punto de vista continuo. Sin embargo, en la práctica, las imágenes y los núcleos de convolución son discretos. ¿Cómo elegir una aproximación discreta óptima del núcleo gaussiano continuo?

La aproximación discreta estará más cerca del núcleo gaussiano continuo cuando se usa un radio mayor. Pero esto puede tener el costo de la duración de cálculo adicional.

Idealmente, uno seleccionaría un valor para sigma, luego calcularía un radio que permita representar fielmente el núcleo gaussiano continuo correspondiente. Para un error de aproximación dado, cuanto mayor sea la sigma, mayor será el radio.

Curiosamente, esto puede ser muy complicado para hacerlo bien. Al construir la matriz gaussiana, ¿es la mejor solución para muestrear el núcleo continuo o hay mejores aproximaciones? ¿Cómo normalizar el núcleo discreto calculado para tener en cuenta el truncamiento? etc.

Como referencia, en Mathematica la función GaussianMatrix presenta varias formas de calcular una matriz discreta gaussiana, por ejemplo, usando la aproximación discreta de Bessel. Por defecto, radio = 2 * sigma, lo que significa que con sigma = 1, la matriz será 5x5.

Matthias Odisio
fuente
Esta es una pregunta bastante antigua. Pero, ¿un radio de 2 * sigma no daría como resultado una matriz de 9x9?
Lógica delirante
@DelusionalLogic con sigma = 1, radio = 2, por lo que la matriz tendrá un tamaño 4 pero necesita un tamaño impar, por lo tanto, tamaño 5x5. Al menos así es como lo entiendo ..
Micka
Si el radio es 2, el vecindario extiende el píxel central en 2 píxeles hacia la izquierda, 2 hacia la derecha, etc. Es solo la convención que utiliza Mathematica.
Matthias Odisio
2

Resulta que las filas del Triángulo de Pascal se aproximan bastante a un Gaussiano y tienen la ventaja práctica de tener valores enteros cuya suma es una potencia de 2 (podemos almacenar estos valores exactamente como enteros, valores de punto fijo o flotantes). Por ejemplo, supongamos que deseamos construir un núcleo gaussiano 7x7, podemos hacerlo usando la 7ma fila del triángulo de Pascal de la siguiente manera:

ingrese la descripción de la imagen aquí

Tenga en cuenta que este filtro tiene la influencia mínima en las esquinas mientras se mantiene el valor entero. Puede usar el valor medio 20/64 para determinar la desviación estándar correspondiente sigma que es 64 / (20 * sqrt (2 * pi)) = 1.276 para el gaussiano aproximado en este caso. Puede graficar el gaussiano para ver que este ajuste es excelente.

Entonces, un buen punto de partida para determinar una desviación estándar razonable para un Kernel gaussiano proviene del Triángulo de Pascal (también conocido como Coeficientes Binomiales ), para un filtro (N + 1) x (N + 1) correspondiente al uso de construcción anterior

ingrese la descripción de la imagen aquí

GaussianMatrix de Wolfram Alpha [3] solo usa r / 2 = 1.5. Por extraño que parezca, GaussianMatrix [{3,1.276}] no produce el mismo filtro 2D que el mío y no es el siguiente para x, y entre -3 y 3:

ingrese la descripción de la imagen aquí

No estoy seguro de por qué no Mi filtro 2D es un excelente ajuste.

wcochran
fuente