2010-01-18 11 views
5

Sto facendo un codice di elaborazione delle immagini in C#, ma non posso usare alcuna libreria o codice simile a GNU.Codifica UnsharpMask senza funzioni Fourier

La funzione UnsharpMask dipende dalla sfocatura gaussiana che a sua volta dipende dalle trasformate di Fourier. Ho scritto il codice per tutto questo e le cose stanno funzionando, ma per farla breve, ho bisogno di rimuovere le funzioni FFT. C'è un modo per eseguire la maschera di contrasto in un altro modo che forse non ha bisogno di FFT?

+0

Penso che sarebbe interessante sapere perché non è possibile utilizzare le trasformate di Fourier considerando l'enorme aumento di velocità che si otterrebbe utilizzando. –

+0

Fondamentalmente si tratta di test dell'unità. Sto mantenendo UnsharpMask in giro per motivi legacy ed è usato raramente. Tuttavia, per supportare tale funzione ho dovuto creare una classe piuttosto ampia per gestire immagini in formato numerico complesso e funzionalità FFT, complete di test. L'unità testare questi FFT è un vero dolore, ma non sarebbe un problema se usassimo UnsharpMask. – Jono

+0

Invece di cercare di sostituire FFT con qualcos'altro, sarebbe possibile sostituire la sfocatura gaussiana con qualcos'altro e fare ancora il UnsharpMask? – Jono

risposta

2

ho trovato una soluzione per soddisfare le mie esigenze.

Ho provato diversi algoritmi di sfocatura rapida e sporca e ho trovato sia Box Blur che Stack Blur sufficienti. Stack Blur ha una sfocatura più pulita di Box Blur ed è più volte più veloce del gaussiano. Quindi posso usare uno dei due al posto di Gaussian.

Così ora posso sbarazzarmi di tutto il disordine del codice FFT e sostituirlo con qualcosa di molto più gestibile. Questa soluzione potrebbe non essere adatta a tutti, ma dal momento che UnsharpMask si basa sulla sfocatura, non ritenevo che fosse una scienza troppo esatta.

A proposito, la sfocatura gaussiana di Gimp sembra evitare anche FFT.

+0

I ' Ho usato spesso la sfocatura della casella due o tre volte per ottenere una rapida sfocatura di sfocatura quando avevo bisogno di visualizzare automaticamente un numero elevato di immagini. – DarenW

+0

Penso che GIMP stia usando l'approssimazione di IIR per il Gaussian Blur. – Royi

3

La parte di trasformata di Fourier di una sfocatura gaussiana è solo un modo efficiente di eseguire la convoluzione con un kernel gaussiano. Puoi farlo usando la convoluzione diretta con un kernel gaussiano della deviazione standard e della dimensione appropriate (un kernel di dimensioni dispari di circa 5-6 volte la deviazione standard è corretto).

Vedere Convolution on Wikipedia.

+0

Buona risposta. Si sta scambiando un algoritmo O (n ln n) per un algoritmo O (n * n) (convoluzione diretta), quindi le immagini 2D uniformi con convoluzione diretta saranno notevolmente più lente. Potresti copiare l'algoritmo FFT da Ricette Numeriche abbastanza facilmente se la velocità diventa un problema. – Paul

+0

Credo che il codice NR non sia gratuito per uso commerciale (sebbene l'op non specifichi, suppongo che se il codice GNU è un problema la licenza NR potrebbe essere pure). –

0

Credo che anche se non è possibile utilizzare alcuna libreria o cosa GNU, è possibile osservare la loro implementazione e provare a riprodurre codice simile per le proprie esigenze?

elenco delle funzioni openCV. controlla qui i dettagli della funzione e poi i dettagli di implementazione nei file di intestazione. http://opencv.willowgarage.com/documentation/genindex.html

Inoltre, se siete interessati nell'attuazione basata C# vorrei suggerire il seguente http://aforgenet.com/framework/

+0

openCV potrebbe funzionare. Aforge è LGPL che non posso usare. Inoltre, ho notato che la sfocatura di Gauss in The Gimp non sembra utilizzare FFT: http://git.gnome.org/browse/gimp/tree/plug-ins/common/blur-gauss.c – Jono