2012-08-29 18 views
5

La mia domanda è semplice. Potrebbe essere troppo semplice. Ma il fatto è che mentre lavoravo su uno dei miei progetti ho usato le seguenti righe per dilatare un'immagine binaria.Sta eseguendo due Dilatazioni morfologiche con elemento di strutturazione 3x3 uguale a uno con elemento di strutturazione 6x6?

cv::dilate(c_Proj, c_Proj, Mat(), Point(), 2); 

Che sostanzialmente dilata l'immagine binaria con un elemento di struttura rettangolare 3x3. Da l'ultimo argomento potete vedere sto eseguendo 2 iterazioni di queste operazioni, il che equivale a:

cv::dilate(c_Proj, c_Proj, Mat(), Point(), 1); 
cv::dilate(c_Proj, c_Proj, Mat(), Point(), 1); 

mia domanda è questa: Invece di eseguire due iterazioni, se effettuo una sola iterazione utilizzando una strutturazione 6x6 elemento, è equivalente al codice precedente in termini di accuratezza e prestazioni? È più veloce quando l'immagine viene iterata una volta sola?

risposta

6

dilatazione con lo stesso kernel può essere espresso con due operazioni di convoluzione:

("YourImage" convolve "DilationKernel") convolve "DilationKernel" 

causa delle proprietà di convoluzione, questa operazione è equivelant a:

"YourImage" convolve ("DilationKernel" convolve "DilationKernel") 

La convoluzione di un kernel 3x3 con se stesso risulterà in matrice 5x5, quindi la tua ipotesi 6x6 è sbagliata.

In termini di prestazioni, c'è così tanto da considerare. Nel mio precedente stage, il nostro obiettivo è quello di utilizzare il kernel più piccolo possibile a causa delle perdite di prestazioni dei kernel più grandi. La regola generale è che i kernel piccoli agiscono più rapidamente su un'immagine perché semplicemente è possibile memorizzarli e recuperarli utilizzando i registri CPU, senza accedere alle cache L1 o L2. Inoltre, se il tuo kernel si adatta ai registri, puoi facilmente utilizzare le istruzioni SSE.

La parallelizzazione della convoluzione è un'altra storia, e non ho molte informazioni pratiche a riguardo. Quindi non so se questi fatti empirici valgono ancora se si utilizza un'implementazione parallela.

+0

Grazie per aver segnalato l'errore. Sto ancora cercando un confronto delle prestazioni. Penso che potrei dover escogitare il mio metodo per confrontare entrambe le operazioni – masad

0

Si dovrà misurare la prestazione da soli ma sembra logico che una dilatazione con un elemento 6x6 sia più veloce. Wikipedia sais che la dilatazione binaria è associativa. Ciò significa che se un rettangolo 3x3 dilatato con un altro rettangolo di questo tipo fornisce un rettangolo 6x6, in effetti due dilatazioni di 3x3 equivalgono a una dilatazione di 6x6.

+2

Perché "sembra logico"? Un'implementazione ingenua dovrebbe guardare a 6 * 6 vicini per ciascun pixel o 2 * 3 * 3 pixel. 6 * 6> 2 * 3 * 3 – Niki

+0

@nikie, hai ragione. Anche se per gli elementi di struttura rettangolare questo può essere ottimizzato con somme prefissate. Non ho molta familiarità con gli algoritmi utilizzati nella morfologia dell'immagine. –

Problemi correlati