Domanda

Scrivo la mia filtro gaussiano, ma è molto lento.

algoritmo di Gauss di OpenCV è molto più veloce, 20 volte che il mio filtro gaussiano. Voglio riscrivere l'algoritmo di Gauss di OpenCV nel mio progetto, e io non voglio includere OpenCV nel mio progetto.

Tuttavia,

  

Qualcuno può darmi la descrizione dell'algoritmo, il codice sorgente di OpenCV   sembra troppo difficile da capire?

È stato utile?

Soluzione

Il filtro gaussiano ha una proprietà che rende molto facile per accelerare: il filtro può essere applicato in entrambe le dimensioni in modo indipendente. Si definisce un unidimensionale filtro che opera verticalmente, ed un altro che opera in orizzontale, e entrambi applicato; questo produce lo stesso effetto di un singolo filtro applicato in due dimensioni.

Oltre a ciò, avrete probabilmente bisogno di guardare le esempio SSE3 disponibili per il processore.

Altri suggerimenti

Per rispondere alla seconda parte della tua domanda, una sfocatura gaussiana è semplicemente la superficie gaussiana 3-D applicato come un nucleo di convoluzione sull'immagine. Wikipedia ha un grande riferimento sull'algoritmo in sé, ma in fondo, si prende i valori di una gaussiana curva e convertire in una matrice quadrata, e moltiplicarlo per ogni pixel dell'immagine, ad esempio:

Kernel:               
[0 1 2 0 0
1 4 6 4 1      X   Iterate over every single pixel in the image
2 6 10 6 2
1 4 6 4 1
0 1 2 1 0]

(Si noti che questo è solo un kernel campione, là è Eqns molto specifiche, che, a seconda delle variabili gaussiana, si otterrà risultati diversi)

Per rispondere alla parte delle prestazioni della tua domanda, la velocità generale di questo algoritmo dipenderebbe su alcune cose, assumendo un'immagine costante dimensioni. Diciamo l'immagine è pixel NxM, e il kernel di convoluzione è pixel PxP. Si sta andando ad avere a che fare P P Operazioni N * m. La maggior P, le più operazioni che si sta andando ad avere a che fare per una data immagine. È possibile ottenere furbo con l'algoritmo si usa qui, facendo molto specifica riga o la matematica basato colonnare.

L'implementazione è anche molto importante. Se si vuole essere estremamente efficiente, probabilmente si vorrà utilizzare le istruzioni più avanzate che l'architettura offre. Se stai usando un chip Intel x86, probabilmente si vorrà a guardare ad ottenere una licenza per le primitive di prestazioni Intel (IPP) e chiamando direttamente tali istruzioni. IIRC, OpenCV fa fare uso di IPP quando il suo disponibili ...

Si potrebbe anche fare qualcosa di molto intelligente e lavorare con tutti gli interi scalati se le prestazioni in virgola mobile sulla vostra data architettura è scarsa. Ciò probabilmente accelerare le cose un po ', ma vorrei cercare altre possibilità prima di andare su questa strada.

Prova a controllare qui . Si vuole capire la matrice gaussiana discreta prima del tempo, poi convolvere con l'immagine.

Se il kernel di convoluzione è relativamente grande e si implementa convoluzione diretta, la differenza di prestazioni può essere perché OpenCV sta attuando convoluzione utilizzando una trasformata di Fourier veloce (FFT).

Odio essere pedante, ma si sta chiedendo un algoritmo, cioè, una precisa sequenza di passi necessari per realizzare un compito. Hai già l'algoritmo gaussiano. Quindi il punto chiave della tua domanda è quando si chiede qualcosa di più veloce , che non è la stessa per chiedere un algoritmo.

Per rispondere alla più veloce domanda - volete sapere come OpenCV ottimizza il suo codice, che è un argomento molto tecnico e largo. Vorrei tentare di indovinare dicendo che utilizza il linguaggio assembly, e funzioni specifiche GPU. Mi piacerebbe iniziare imparando assemblaggio, e ricercando il pacchetto CUDA per approfittare della vostra GPU.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top