二維高斯函式具有旋轉對稱性,處理後不會對哪乙個方向上的邊緣進行了過多的濾波,因此相對其他濾波器,具有無法比擬的優越性。但是傳統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小的兩部...