最快速的“高斯”模糊算法(附Android源碼)


 

這是一個外國人的算法,本人是搬運工。參考:http://blog.ivank.net/fastest-gaussian-blur.html

 

1:高斯模糊算法(參考:http://www.ruanyifeng.com/blog/2012/11/gaussian_blur.html)

所謂的模糊算法就是當前像素點和周圍像素點進行加權均值之后的結果替換當前像素值。因此均值模糊是最簡單的,只要將周圍的像素點相加取平均值即可。

    而高斯模糊則是將周圍的像素點的權值按照高斯分布進行取值,即根據距離當前像素點的距離確定取值的權值。如下圖:距離當前像素點越近權值越高,反之越低。之所以這么做是因為高斯模糊出來的效果比較好。

(圖片來自:http://www.ruanyifeng.com/blog/2012/11/gaussian_blur.html)

 

2:高斯模糊的時間復雜度

    假設圖片的像素寬,高是(w*h),模糊半徑是r,那么二維的高斯模糊的時間復雜度是w*h*r*r,如果圖片過大則時間復雜度很高(見二維的高斯分布)。而一般的解決辦法就是將二維的變為一維,因為高斯分布支持卷積運算(參考:http://blog.csdn.net/liguan843607713/article/details/42215965),因此先進行x方向的一維的高斯模糊,在進行y軸方向的一維高斯模糊,這樣做出來的效果是一樣的(見一維的高斯分布)。

    但是即使這樣高斯模糊的時間復雜度是w*h*2*r,仍然很高。所以需要另一種辦法解決。

二維的高斯分布

 

一維的高斯分布

 

3:最快速的高斯模糊

    其實這篇文章(http://blog.ivank.net/fastest-gaussian-blur.html)給出的並不是真正的高斯模糊,而是使用均值模糊(box blur)進行擬合之后,效果接近高斯模糊。均值模糊之所以快速是因為進行模糊處理時當前的像素值的計算可以利用到之前只算的值,所以不必重復計算。而均值模糊也可以進行卷積計算,可以講二維的降為一維。因此大大減少了時間的消耗。

    根據這篇論文(http://www.csse.uwa.edu.au/~pk/research/pkpapers/FastGaussianSmoothing.pdf),基本上3次均值模糊就可以接近於高斯模糊(本人論文並沒有研讀,只是直接使用了http://blog.ivank.net/fastest-gaussian-blur.html給出的計算半徑的公式)。問題的關鍵就在於怎么根據高斯模糊的半徑,找到對應的均值模糊模糊的半徑。上述網址給出了計算方法:

 

    總之,總結起來就是,利用多次均值模糊進行擬合成高斯模糊。一般來說3次就可以達到效果。因為均值模糊的時間復雜度是w*h,所以利用多次均值模糊代替高斯模糊的時間復雜度大大減少。具體效果參考http://blog.ivank.net/fastest-gaussian-blur.html

 

4:說明

    在Android最快的高斯模糊並不是以上的兩種方法,而是使用RenderScript,但是RenderScript的缺點是模糊半徑不能大於25。在實際應用中可以先將圖片縮小模糊,再放大可以節省很多時間。

 

5:Android源代碼分享:

    Android代碼包括,一個一維的標准的高斯模糊和利用3次均值模糊擬合過的"最快速高斯模糊"。利用jni編寫。

 

代碼Github網址:https://github.com/amazingyyc/fasted_gauss_blur

 

原始圖片,670x455的分辨率

 

模糊后的效果:可以看到兩個算法時間差別巨大!!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM