最快速的「高斯」模糊演算法(附Android原始碼)

2021-07-03 19:51:57 字數 1597 閱讀 5553

這是乙個外國人的演算法,本人是搬運工。參考:

1:高斯模糊演算法(參考:

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

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

(來自:

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

假設的畫素寬,高是(w*h),模糊半徑是r,那麼二維的高斯模糊的時間複雜度是w*h*r*r,如果過大則時間複雜度很高(見二維的高斯分布)。而一般的解決辦法就是將二維的變為一維,因為高斯分布支援卷積運算(參考:因此先進行x方向的一維的高斯模糊,在進行y軸方向的一維高斯模糊,這樣做出來的效果是一樣的(見一維的高斯分布)。

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

二維的高斯分布

一維的高斯分布

3:最快速的高斯模糊

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

根據這篇**(基本上3次均值模糊就可以接近於高斯模糊(本人**並沒有研讀,只是直接使用了給出的計算半徑的公式)。問題的關鍵就在於怎麼根據高斯模糊的半徑,找到對應的均值模糊模糊的半徑。上述**給出了計算方法:

總之,總結起來就是,利用多次均值模糊進行擬合成高斯模糊。一般來說3次就可以達到效果。因為均值模糊的時間複雜度是w*h,所以利用多次均值模糊代替高斯模糊的時間複雜度大大減少。具體效果參考。

4:說明

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

5:android源**分享:

android**包括,乙個一維的標準的高斯模糊和利用3次均值模糊擬合過的"最快速高斯模糊"。利用jni編寫。

**github**:

原始,670x455的解析度

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

高斯模糊演算法

正太分布,又稱高斯分布 正態分佈的前世今生 上 正態分佈的前世今生 下 通常,影象處理軟體會提供 模糊 blur 濾鏡,使產生模糊的效果。模糊 的演算法有很多種,其中有一種叫做 高斯模糊 gaussian blur 它將正態分佈 又名 高斯分布 用於影象處理。本文介紹 高斯模糊 的演算法,你會看到這...

高斯模糊演算法

通常,影象處理軟體會提供 模糊 blur 濾鏡,使產生模糊的效果。模糊 的演算法有很多種,其中有一種叫做 高斯模糊 gaussian blur 它將正態分佈 又名 高斯分布 用於影象處理。本文介紹 高斯模糊 的演算法,你會看到這是乙個非常簡單易懂的演算法。本質上,它是一種資料平滑技術 data sm...

高斯模糊演算法(直接型)

為了便於說明,先假設模糊半徑 r 3 方差 sigma 1.5 對應的畫素矩陣為 14 15 16 24 25 26 34 35 36 簡單一點的說,假設要對某個點進行高斯模糊,則把它視為 中心點,座標為 0,0 然後根據其模糊半徑的不同 如,模糊 半徑為3時 其周圍的8個點的 上下左右,兩個斜對角...