2009-06-01 45 views
5

我自己寫高斯濾波器,但速度很慢。高斯濾波器算法在OpenCV中的工作方式

的OpenCV的高斯算法快很多,比我高斯濾波器的20倍。 我想在我的項目中重寫OpenCV的高斯算法,並且我不想在我的項目中包含opencv。

然而,

誰能給我的算法描述,OpenCV的源代碼 也不難理解?

回答

12

高斯濾波器具有,使得它很容易加速的屬性:所述過濾器可以在兩個維度上獨立地應用。您可以定義垂直操作的一維過濾器,以及另一個水平操作的過濾器,並將它們應用於兩者;這產生與在二維中應用的單個濾波器相同的效果。

除此之外,你可能需要看看SIMD instructions例如SSE3可用於您的處理器。

+2

這是一個快速簡便的方法與P 1 2個操作的PXP內核2P操作,以加快直接卷積。 – las3rjock 2009-06-01 05:18:44

4

要回答你的問題的第二部分,高斯模糊就是一個三維高斯曲面,它被用作圖像上的卷積核。 Wikipedia對算法本身就是一個很好的參考,但基本上,你把高斯曲線的價值和轉換是成方陣,並在圖像的每一個像素相乘,如:

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] 

(請注意,這只是一個示例內核,有非常具體的eqns,這取決於你的高斯變量,你會得到不同的結果)

要回答你的問題的性能部分,這個算法的總體速度將取決於在幾件事情上,假設一個大小不變的圖像。可以說圖像是NxM像素,卷積內核是PxP像素。你將不得不做N * M個操作。 P越大,對於給定的圖像您將需要執行的操作越多。你可以用你在這裏使用的算法很狡猾,做非常特定的行或列的數學計算。

實現也很重要。如果你想要非常高效,你可能會想要使用你的架構提供的最先進的指令。如果您使用的是英特爾x86芯片,那麼您可能需要考慮獲取英特爾性能原語(IPP)的許可證並直接調用這些指令。 IIRC,OpenCV中確實使用IPP時,其提供的...

你也可以做一些非常聰明,並與所有比例整數的工作,如果你的既定體系浮點性能較差。這可能會加速一點,但在走這條路之前,我會首先考慮其他選項。

2

嘗試檢查here。您想提前計算離散高斯矩陣,然後將其與圖像進行卷積。

+0

非常感謝你,rlbond – user25749 2009-06-01 06:19:04

1

如果您的卷積核較大,要實現直接卷積,性能差異可能是因爲OpenCV的是使用快速傅立葉變換(FFT)實現卷積。

-1

我討厭被迂腐,但你所要求的算法,也就是完成任務所需步驟的精確序列。你已經有了高斯算法。所以你的問題的關鍵是,當你問的東西更快,這是不一樣的要求的算法。

要回答更快問題 - 您想知道OpenCV如何優化其代碼,這是一個高度技術性和廣泛的主題。我會說,它使用匯編語言和GPU專用功能妄自揣測。我想通過學習組裝,和研究CUDA包把你的GPU的優勢開始。