3 votos

¿Cómo puedo aplicar un desenfoque gaussiano (filtro de paso bajo) a una imagen formada por un conjunto de puntos?

Tengo una imagen codificada en forma de lista de puntos, así:

335.0 2743.0 
335.0 2754.0 
325.0 2754.0 
304.0 2743.0 
304.0 2733.0 
283.0 2723.0 
273.0 2702.0 
273.0 2691.0 
273.0 2681.0 
273.0 2670.0 
283.0 2670.0 
294.0 2670.0 
304.0 2670.0 
325.0 2670.0 
335.0 2681.0 
346.0 2702.0 
346.0 2712.0 
356.0 2723.0 
346.0 2733.0 
346.0 2743.0 
346.0 2733.0 
346.0 2723.0 
356.0 2702.0 
356.0 2670.0 
356.0 2660.0 
367.0 2660.0 

Hay una línea dibujada entre cada punto para hacer la imagen - si dibujas los puntos de arriba (te aconsejo que lo hagas programáticamente) verás una 'a' minúscula. Esto forma parte de un proyecto de reconocimiento de caracteres en línea. Actualmente estoy investigando los efectos de varias técnicas de preprocesamiento que pueden aplicarse a un sistema de reconocimiento de este tipo, y una técnica que aplican muchos de los artículos que he leído es "suavizar" la imagen, normalmente mediante un desenfoque gaussiano. Desgraciadamente, todos ellos lo proclaman como "fácil", y por ello olvidan mencionar cómo uno va a hacerlo.

Llevo bastante tiempo buscando, pero me encuentro con que todavía no puedo entender cómo tomaría la idea y la aplicaría a una imagen formada por un conjunto de puntos como el de arriba. De la wikipedia artículo tengo la función:

$G(X) = \frac{1}{\sqrt{2\pi\sigma^2}}e^{-\frac{x^2}{2\sigma^2}}$

Sin embargo, no tengo ni idea de cómo aplicar eso a mi lista de puntos para obtener una imagen suavizada. Todos los ejemplos en línea son increíblemente complicados y también para imágenes de píxeles, donde cada píxel de la imagen importa. En este caso, sólo tengo una veintena de puntos. Por lo tanto, lo que estoy buscando es alguna explicación y consejo con respecto a cómo aplicaría un desenfoque gaussiano en mi forma de representar la imagen - ¿qué aplico $G(X)$ a (¿cada coordenada?), cómo calculo $\sigma^2$ etc.

El descargo de responsabilidad : Como se ha dicho, esto es parte de una tarea. Sin embargo, no se trata de romper ninguna regla ni de hacer "trampa" de ninguna forma. La asignación es para investigar muchas características del reconocimiento de caracteres en línea, no para saber mágicamente cómo hacer una de las posibles técnicas de preprocesamiento de los caracteres. Si obtengo algún conocimiento de cómo hacer el suavizado de este sitio, el sitio (y el individuo, si lo desea) será, por supuesto, acreditado en su totalidad.

Le agradezco cualquier ayuda. Espero que esta pregunta esté bien colocada (me ha parecido más matemática que de programa, ya que se trata más del concepto de desenfoque gaussiano que de la implementación, estoy bastante seguro de que podré manejar esa parte) y que sea clara. Si no lo es, por favor, sólo pregunta y aclararé los puntos que pueda.

(También me disculpo por la etiqueta. Estoy bastante seguro de que es inexacta. Pero no hay ninguna etiqueta 'gaussiana'. Es impar).

3voto

Yaakov Ellis Puntos 15470

La forma estándar de hacerlo es calcular una especie de "máscara" y aplicarla a cada uno.

Por "máscara" me refiero, por ejemplo, a una función para el punto actual basada en los puntos anteriores y posteriores. Por ejemplo:

$f(x) = \frac{1}{9}[x-2] + \frac{2}{9}[x-1] + \frac{3}{9}[x] + \frac{2}{9}[x+1] + \frac{1}{9}[x+2] $

où $[p]$ es el valor del píxel en $p$ .

Así que para encontrar el nuevo valor del píxel en, digamos, el píxel $4$ , usarías $ \frac{1}{9}[2] + \frac{2}{9}[3] + \frac{3}{9}[4] + \frac{2}{9}[5] + \frac{1}{9}[6] $ (recordando que, por ejemplo, $[3]$ es el valor del píxel 3)

Lo único que queda por hacer es aplicar la máscara a cada píxel. (¿Qué deberías usar para los píxeles que están cerca del borde? Eso depende de ti).

Tenga en cuenta que para ser una verdadera máscara de desenfoque, sus coeficientes deben sumar 1.

Un "Desenfoque Gaussiano" es simplemente aplicar una máscara especial basada en la Curva Gaussiana a sus píxeles.

Es decir, haces que el "coeficiente" de cada término sea un número basado en la Curva de Gauss en ese punto.

Por ejemplo, listas de wikipedia :

$f(x) = 0.00038771[x-3] + 0.01330373[x-2] + 0.11098164[x-1] + 0.22508352[x] + 0.11098164[x+1] + 0.01330373[x+2] + 0.00038771[x+2]$

como una máscara con σ = 0,84089642 y un radio de "corte" de 3, aunque puedes elegir tu propia desviación estándar y radio de corte a tu gusto.

2voto

Shabaz Puntos 403

La operación se describe mejor en el artículo de Wikipedia Filtro gaussiano . Primero tienes que convertir tu lista de puntos en una imagen, en esencia rellenando la línea entre los puntos. Si utilizas 8 bits, esas celdas tendrán una oscuridad de 255, mientras que todas las demás serán 0. O quizás le des a las líneas un grosor y calcules qué parte de cada píxel está cubierta. Ahora la imagen es una gran matriz de números. El valor de sigma lo puedes elegir tú. A partir de sigma que elijas se calculará una pequeña matriz que representa G(X). Si sigma es un píxel, puedes representar G(X) sólo sobre +-3 píxeles, por lo que es 7x7. Para calcular la oscuridad borrosa de un píxel, tomas las oscuridades originales de la vecindad 7x7 del píxel, las multiplicas por la matriz G(X) y sumas.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X