2010-01-18 10 views
5

Estoy haciendo un código de procesamiento de imagen en C#, pero no puedo usar ninguna biblioteca o código similar a GNU.Codificación UnsharpMask sin funciones de Fourier

La función UnsharpMask depende del desenfoque gaussiano, que a su vez depende de las transformadas de Fourier. Escribí el código para todo esto y las cosas están funcionando, pero para abreviar, necesito eliminar las funciones de FFT. ¿Hay alguna forma de realizar la máscara de enfoque de otra manera que quizás no necesite FFT?

+0

Creo que sería interesante saber por qué no se pueden usar las transformadas de Fourier teniendo en cuenta la aceleración masiva que obtendría al usarla. –

+0

Básicamente se trata de pruebas unitarias. Mantengo UnsharpMask por razones heredadas y rara vez se usa. Sin embargo, para admitir una función de este tipo, tuve que crear una clase bastante grande para manejar imágenes complejas de formato numérico y funcionalidad FFT, completa con pruebas. La prueba unitaria de estas FFT es un verdadero dolor, pero no sería un problema si alguna vez usamos UnsharpMask. – Jono

+0

En lugar de buscar reemplazar FFT por otra cosa, ¿sería posible reemplazar el desenfoque gaussiano por otra cosa y seguir haciendo UnsharpMask? – Jono

Respuesta

2

he encontrado una solución para adaptarse a mis necesidades.

Probé varios algoritmos de desenfoque rápidos y sucios y encontré que tanto Box Blur como Stack Blur eran suficientes. Stack Blur tiene un desenfoque más limpio que Box Blur y es varias veces más rápido que Gaussian. Entonces puedo usar cualquiera de los dos en lugar de Gaussian.

Así que ahora puedo deshacerme de todo el código FFT y reemplazarlo por algo mucho más manejable. Esta solución puede que no sea para todos, pero como UnsharpMask se basa en imágenes borrosas, no creo que sea una ciencia demasiado exacta.

Por cierto, el desenfoque gaussiano de Gimp parece estar evitando las FFT también.

+0

I ' A menudo utilicé la imagen borrosa de la caja dos o tres veces para obtener una forma rápida y difusa de borrosidad cuando necesitaba desenfocar un gran número de imágenes automáticamente. – DarenW

+0

Creo que GIMP está utilizando la aproximación IIR para Gaussian Blur. – Royi

3

La parte de transformada de Fourier de un desenfoque gaussiano es solo una forma eficiente de realizar la convolución con un núcleo gaussiano. Puede hacerlo utilizando la convolución directa con un núcleo gaussiano de la desviación estándar y el tamaño apropiados (un núcleo de tamaño impar alrededor de 5-6 veces la desviación estándar es aproximadamente la correcta).

Ver Convolution on Wikipedia.

+0

Buena respuesta. Está intercambiando un algoritmo O (n ln n) por un algoritmo O (n * n) (convolución directa), por lo que suavizar las imágenes 2D con convolución directa será significativamente más lento. Puede copiar el algoritmo de FFT de Recetas numéricas con bastante facilidad si la velocidad se convierte en un problema. – Paul

+0

Creo que el código NR no es gratuito para uso comercial (aunque el op no especifica, supongo que si el código GNU es un problema, la licencia NR también podría serlo). –

0

Creo que incluso si no puede usar ninguna biblioteca o cosa de GNU, puede ver su implementación e intentar reproducir un código similar para sus requisitos.

lista de funciones de openCV. consulte los detalles de la función aquí y luego los detalles de implementación en los archivos de encabezado. http://opencv.willowgarage.com/documentation/genindex.html

Además, si usted está interesado en la implementación basada en C# que sugeriría la siguiente http://aforgenet.com/framework/

+0

openCV puede funcionar. Aforge es LGPL y no puedo usarlo. Además, noté que el desenfoque de Gauss en The Gimp no parece estar usando FFT: http://git.gnome.org/browse/gimp/tree/plug-ins/common/blur-gauss.c – Jono

Cuestiones relacionadas