Gauss濾波的快速實現方法

2021-07-03 16:07:25 字數 1660 閱讀 8790

二維高斯函式具有旋轉對稱性,處理後不會對哪乙個方向上的邊緣進行了過多的濾波,因此相對其他濾波器,具有無法比擬的優越性。但是傳統gauss濾波隨著影象尺寸的增加,運算複雜度呈平方**,因此需要對其優化改進。下面,分別介紹傳統型,分解型和遞迴迭代型三種實現方法。

gauss濾波首先需要構建乙個gauss濾波核,公式為:

matlab實現**:

dsigma =0.8;

fk1=1.0/(2*dsigma*dsigma);

fk2=fk1/pi;

isize = 5;

step = floor(isize/2 + 0.5);

for i = 1 : isize

x=i-step;

ftemp=fk2*exp(-x*x*fk1);

for j = 1 : isize

y=j-step;

model(x+step,y+step)=ftemp*exp(-y*y*fk1);

endenddsum = sum(sum(model));

model = model/dsum; %gauss核數值歸一化

圖1 gauss濾波核(5*5大小)

接下來就是將輸入影象和濾波核進行卷積操作。其實質就是對原始影象進行加權求和,把這個「和」賦給中心畫素。對於乙個2048*2048的影象,需要進行104734756次乘法運算,和104734756次加法運算,運算複雜度是很高的。

我們可以把乙個二維gauss核分解為兩個一維高斯核,然後先對行做一次一維卷積,再對這個卷積結果做一次一維列卷積,得到的結果完全一模一樣,而開銷會小很多。

一維高斯核函式:

matlab**實現:

dsigma =0.8;

fk1=1.0/(2*dsigma*dsigma);

fk2=fk1/pi;

isize = 5;

step = floor(isize/2 + 0.5);

for i = 1 : isize

x=i-step;

ftemp=fk2*exp(-x*x*fk1);

model(1,x+step) = ftemp;

enddm = sum(model);

model = model / dm;

圖2 一維高斯濾波核(1*5大小)

一維卷積原理和二維卷積一樣,只不過我們只需要將同一行或同一列上的資料,按位置一一加權求和,再把「和」賦給中心元素。

對於乙個2048*2048的影象,需要進行41918464次乘法運算,和41918464次加法運算。相比傳統運算量,只是前者的1/2.4985。如果遇到頻繁計算gauss濾波的演算法,後者明顯比前者速度快很多。

第二種方法較第一種方法,雖然有了較大改善,但是任然複雜度較高。這裡再介紹一種更快速的逼近gauss濾波方法。

具體步驟分為兩步:首先對影象做一次前向濾波,其次,對影象再做一次後向濾波。

快速中值濾波 Python實現

中值濾波是空域中常用的一種濾波方式,是一種非線性的濾波。它的原理就是將視窗畫素排序,取中值,然後移動視窗,不斷重複取中值的過程。但是,可以發現,每次移動視窗,都需要對畫素點進行排序,從而選取中間的那個畫素點。每次重新排序的效率特別低,為了優化這個排序,便有了快速中值濾波。快速中值濾波是中值濾波的優化...

快速雙邊濾波 Python實現

介紹 課程的最後乙個實驗是處理雀斑,網上查詢了很多方法,最後我選擇了快速雙邊濾波。但是實驗又不能直接呼叫 opencv 的庫,因此,我參照了 這個部落格,將用 c 寫的快速雙邊濾波改用 python 重新寫了一遍。快速雙邊濾波是啥呢,官方滴說,它是一種非線性的濾波方法。它最大的特點就是既使用了顏色的...

快速排序的實現方法

快速排序法一般來說可以分為三種,分別是 基礎快速排序法 雙路快速排序法 三路快速排序法 下面分別對以上三種快排進行梳理。基礎快速排序法 排序思路 首先傳入待排序陣列,使用變數l表示陣列下標起點,使用變數r表示陣列下標終點,然後取陣列第乙個元素e做中介,使用迴圈逐步將陣列元素分為比e小和不比e小的兩部...