%%以下是本人在學習中的個人理解,如有錯誤請指出
所謂的濾波就是一個係數矩陣(也稱爲模板,濾波器,濾波模板,核,掩模或者窗口),然後用這個模板對應圖像矩陣(填充0後的圖像矩陣)進行乘積和運算。
均值濾波就是這個濾波器每個值都是一樣大小,每個值是1/k(k爲濾波器矩陣的大小),用於去噪
濾波器可通過 w=fspecial(‘type’,parameters)得到,其中type指定濾波器類型,parameters進一步定一規定的濾波器
用fspecial(‘average’)可以創建一個均值濾波器,默認3*3,每個值都是1/3*3=0.1111
>> h=fspecial('average')
h =
0.1111 0.1111 0.1111
0.1111 0.1111 0.1111
0.1111 0.1111 0.1111
然後創建個簡單矩陣
>> x=[1,2,3;4,5,6;2,2,2]
x =
1 2 3
4 5 6
2 2 2
使用filter2(h,x)進行濾波,h爲濾波器,x爲要濾波的數據,將h放在x上移動進行模板濾波。
y=filter2(h,x)
y =
1.3333 2.3333 1.7778
1.7778 3.0000 2.2222
1.4444 2.3333 1.6667
下面分析過程
填充0後的圖像矩陣x:
x =
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 1 2 3 0 0
0 0 4 5 6 0 0
0 0 2 2 2 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
然後進行乘積和運算
x中
0 0 0
0 1 2
4 5 6
分別和h對應的各元素做乘積然後求和:即(1+2+4+5+6)*0.1111=1.3333
所得結果即爲濾波後圖像y的y(1,1)(對應着x(1,1)),以此類推。
(1+2+4+5+6)*0.1111=(1+2+4+5+6)/9=1.3333
其原理其實就等於用該點的像素值得領域矩陣的均值來代替這點的像素值
即對以該點爲中心點的領域矩陣求和 / 領域矩陣大小
下面是均值濾波實現代碼:
function [c]=junzhilvbo(j,k)
[m,n]=size(j);
b=zeros(m+2*k,n+2*k);%創建0矩陣
b(k+1:m+k,k+1:n+k)=double(j(:,:));
% 0 0 0(k行0,其他方向也是)
%b= 0 j 0
% 0 0 0
c=zeros(m,n);
for i=k+1:m+k
for j=k+1:n+k
b(i,j)=sum(sum(b(i-k:i+k,j-k:j+k)))/((2*k+1).^2);%b(i,j)這個點爲中心點的(2*k+1)^2的大小的矩陣的和*(1/(2*k+1))
end %這裏就是均值均值濾波
end
c(:,:)=b(k+1:m+k,k+1:n+k);
%figure,imshow(c,[]);
中值濾波法是一種非線性平滑技術,它將每一像素點的灰度值設置爲該點某鄰域窗口內的所有像素點灰度值的中值,對去椒鹽噪聲十分有效。
工具箱提供的函數是
g=medfilt2(f,[m,n],padopt)
[m,n]定義一個大小爲m*n的領域(在該領域上計算中值),padopt指定三個可能的邊界填充選項之一(zeros默認值,symmetric,indexed)
默認形式爲
g=medfilt2(f)
使用一個3*3的領域並用0填充邊界來計算中值
下面看例子
f=imread('caise.jpg');
f=rgb2gray(f);
fn=imnoise(f,'salt & pepper',0.2);%用函數imnosie產生椒鹽噪聲,0.2代表圖中白點黑點出現的概率爲0.2
figure,imshow(fn);
gm=medfilt2(fn);%中值濾波
figure,imshow(gm);
%%%文章爲作者手打,記錄和分享自己的學習,如有錯誤請指出,轉載請註明出處