二維高斯模糊,或者說高斯濾波,是影象處理中非常常見的操作。操作的核心是使用乙個從高斯分布中取樣得到的掩膜,或者叫核,和輸入中的每個畫素及其鄰域進行計算,結果儲存到輸出中。假設高斯核視窗尺寸為(2
w+1)
×(2w
+1) ,高斯分布的標準差為
σ ,則高斯核可以表示為矩陣的形式
由於高斯分布的概率密度函式的非零值區間主要集中在 (−
3σ,3
σ)內,所以為了保證選取的高斯核的完整性,一般取 w≈
3σ 。
說完了高斯核,該說高斯模糊的表示式了。設輸入為
x ,輸出為
y ,第
i 行第
j 列的資料表示為 x(
i,j)
和 y(
i,j)
,則使用視窗大小為 (2
w+1)
×(2w
+1) ,標準差為
σ 的高斯核計算後的結果為
但是,注意到,高斯核的表示式是可分離的。下面為了表示方便,令
下面來考慮上述方法在記憶體訪問效率方面的問題。利用 g2
和 x 計算
z 的過程中,記憶體訪問都是連續的,都是從左到右的形式。但是在利用 g1
和 z 計算
y 的過程中,取出每一列中的相鄰資料,需要跨行。如果需要處理的寬度比較大,跨行訪問資料可能會導致 cache miss,這是違反了記憶體訪問區域性性原則的。為了解決這一問題,利用 g1
和 z 計算
y 的方法需要調整。
實際上,利用 g1
和 z 計算
y 同樣可以按行的方式計算。為了表述方便,以計算
y 的第 2 行(下標從 0 開始)y(
2,⋅)
為例, y
(2,⋅
)=g1
(0)z
(0,⋅
)+g1
(1)z
(1,⋅
)+g1
(2)z
(2,⋅
)+g1
(3)z
(3,⋅
)+g1
(4)z
(4,⋅
) 其中 g1
(i)
表示 g1
的第 i
個元素,z(
i,⋅)
表示 z
的第 i 行。
在**實現的時候,為了計算 y(
2,⋅)
,初始化乙個長度為 8 的浮點數行向量
t ,令裡面的值全等於零,然後用遍歷行元素的方式進行如下計算 t
tttt
=t+g
1(0)
z(0,
⋅)=t
+g1(
1)z(
1,⋅)
=t+g
1(2)
z(2,
⋅)=t
+g1(
3)z(
3,⋅)
=t+g
1(4)
z(4,
⋅)
最後將 t
中的浮點數的值四捨五入賦值給 y(
2,⋅)
。這樣就避免了記憶體訪問跨行的問題。注意,為了滿足記憶體訪問的區域性性,增加了記憶體使用量,多用了 t
。對於邊界行,按照映象對稱的方式選取相應行進行計算。比如,為了計算 y(
0,⋅)
,初始化乙個長度為 8 的浮點數行向量
t ,令裡面的值全等於零,然後用遍歷行元素的方式進行如下計算 t
tttt
=t+g
1(0)
z(2,
⋅)=t
+g1(
1)z(
1,⋅)
=t+g
1(2)
z(0,
⋅)=t
+g1(
3)z(
1,⋅)
=t+g
1(4)
z(2,
⋅)
最後將 t
中的浮點數的值四捨五入賦值給 y(
0,⋅)
。本文中所講述的高斯模糊的計算方法,可以擴充套件到任意尺寸可分離核的濾波的實現。
設輸入資料為
x ,hx
行 wx
列,濾波核為
k ,(2
hk+1
) 行 (2
wk+1
) 列,使用
k 對
x 進行二維濾波的結果是
y 。而直接採用二維迴圈的原始計算方法,需要進行 (2
hk+1
)×(2
wk+1
) 次乘法計算和 (2
hk+1
)×(2
wk+1
)−1 次加法計算。計算的時間複雜度是 o(
wkhk
) 的。
如果 k
是可分離核,可以寫成列向量 kv
erti
cal 和行向量 kv
erti
cal 相乘的形式,即 k=
kver
tica
l×kh
oriz
onta
l 。那麼在計算濾波結果
y 的時候,可以先用 kh
oriz
onta
l 對
x 進行行濾波計算,將計算結果儲存到
z 中,計算
z 中的每乙個數值需要 (2
wk+1
) 次乘法計算和 2w
k 次加法計算。再使用 kv
erti
cal 對
z 進行列濾波計算,得到最終結果
y 。在
z 的基礎上計算
y 中的每乙個數值需要 (2
hk+1
) 次乘法計算和 2h
k 次加法計算。總的來說,根據
x 計算
y 中的乙個數值,需要進行 (2
hk+2
wk+2
) 次乘法計算和 2h
k+2w
k 次加法計算。計算的時間複雜度從 o(
wkhk
) 降至 o(
wk+h
k)。列濾波的過程還可以考慮記憶體訪問的區域性性原則,以提高程式的執行效率。
可分離核的實現方法和列濾波的記憶體訪問加速的實現方法,都需要消耗額外的記憶體,用空間複雜度的提高換取時間複雜度和效率的改進。
高斯模糊原理及實現
高斯模糊即對指定畫素和其周圍畫素進行加權平均來得到最終結果,使用高斯分布作為濾波器。高斯分布即為正太分布,1維和2維正態分佈密度函式如下 這裡設 0,0.u為期望,為標準差,為函式影象的拐點,越大曲線越矮越寬,即取樣範圍越大。在這兩個函式中,x,y表示相對於中心畫素 0,0 的偏移量 以畫素為單位 ...
高斯模糊原理,演算法
詳解高斯濾波 高斯模糊的演算法原理 高斯濾波 線性平滑濾波,適用於消除高斯雜訊 具體操作是 用乙個模板 或稱卷積 掩模 掃瞄影象中的每乙個畫素,用模板確定的鄰域內畫素的加權平均灰度值去替代模板中心畫素點的值。高斯模糊 也叫高斯平滑 影象的高斯模糊過程就是影象與正態分佈做卷積。由於正態分佈又叫作高斯分...
高斯模糊 理論
高斯分布函式可表示為乙個一維的函式g x 或者乙個二維的函式g x,y 在這些函式中,x和y代表了相對於原始中心點 center tap 畫素的偏移 pixel offsets 值。也就是說,他們距離中心多少畫素。這裡的center tap,通常翻譯為 中心抽頭 它在電學中的概念是 在整個次級線圈的...