實驗一圖像的濾波處理算法
1、實驗目的函數
使用MATLAB處理圖像,掌握均值濾波器和加權均值濾波器的使用,對比兩種濾波器對圖像處理結果及系統自帶函數和自定義函數性能的比較,體會不一樣大小的掩模對圖像細節的影響。工具
2、實驗內容性能
使用n=3,5,9的正方形均值濾波器和加權均值濾波器對圖像Fig1的濾波處理。觀察處理先後圖像效果,分析實驗結果和算法特色。 ui
3、實驗原理人工智能
一、均值濾波器(平滑線性濾波器):其響應是包含模板內像素平均值,低通濾波器。spa
R = (領域內全部點的值*對應點的掩模係數之和)/(掩模係數之和)blog
g(x,y)=1/n∑f(x,y) n爲該模板中包含當前像素在內的像素總個數索引
二、加權均值濾波器:加權均值濾波算法是一種有效的去除高斯噪聲的算法。ci
若是領域內掩模係數不等,則這個掩模叫加權平均。從權值上看每一個像素的重要性不等,權值越大代表這個像素越重要。
R=(權值*對應像素灰度值全部之和)/(權值之和)
g(x,y)=∑w(s,t)∑f(x,y)/(∑∑w(s,t)) w爲權值
4、實驗步驟
一、n=3正方形均值濾波處理圖像Fig1,使用MATLAB自帶的均值濾波器函數進行圖像的濾波處理
(1)MATLAB自帶均值濾波器函數
>> clear,close all %清除全部
>> I=imread('C:\Users\xyxx\Desktop\image\Fig1.jpg'); %讀取圖像
>> imshow(I); %顯示圖像
>> K1=filter2(fspecial('average',3),I)/255; %使用均值濾波器處理
>> figure,imshow(K1); %顯示處理結果
二、n=5正方形均值濾波處理圖像Fig1,使用MATLAB自帶的均值濾波器函數進行圖像的濾波處理
(1)MATLAB自帶均值濾波器函數
>> clear,close all %清除全部
>> I=imread('C:\Users\xyxx\Desktop\image\Fig1.jpg'); %讀取圖像
>> imshow(I); %顯示圖像
>> K1=filter2(fspecial('average',5),I)/255; %使用均值濾波器處理
>> figure,imshow(K1); %顯示處理結果
三、n=9正方形均值濾波處理圖像Fig1,使用MATLAB自帶的均值濾波器函數進行圖像的濾波處理
(1)MATLAB自帶均值濾波器函數
>> clear,close all %清除全部
>> I=imread('C:\Users\xyxx\Desktop\image\Fig1.jpg'); %讀取圖像
>> imshow(I); %顯示圖像
>> K1=filter2(fspecial('average',9),I)/255; %使用均值濾波器處理
>> figure,imshow(K1); %顯示處理結果
四、使用自定義均值濾波函數處理
源代碼:
% x是須要濾波的圖像,n是模板大小(即n×n)
function d=avg_filter(x,n)
a(1:n,1:n)=1; %a即n×n模板,元素全是1
[height, width]=size(x); %輸入圖像是height,width的,且height>n,width>n
x1=double(x);
x2=x1;
for i=1:height-n+1 %等價於for i=n:height
for j=1:width-n+1
c=x1(i:i+(n-1),j:j+(n-1)).*a; %取出x1中從(i,j)開始的n行n列元素與模板相乘
s=sum(sum(c)); %求c矩陣中各元素之和
x2(i+(n-1)/2,j+(n-1)/2)=s/(n*n); %將與模板運算後的各元素的均值賦給模板中心位置的元素
end
end
%未被賦值的元素取原值
d=uint8(x2);
五、使用加權均值濾波器對圖像Fig1的濾波處理
若 I=[f(i,j)]M×N 表示輸入圖像, 其中 f(i,j)表示圖像灰度 值矩陣中(i,j)點處像素的灰度值。H3(i,j)表明像素中心在(i,j)大小爲 3×3 的一個窗口 ,以下所示 :
加權濾波器的輸出:
該濾波器的具體實現步驟以下 :
(1)將模板H3(i,j)在圖像 I=[f(i,j)]M × N中從左到右、從上到下漫遊,而模板中各位置點會與圖像中的某個像素點重合;
(2)讀取模板 H3(i,j)下各對應像素的灰度值 f(i,j);
(3)將這些灰度值 f(i,j)存儲在一維矩陣中,並進行比較,按升序排成一列;
(4)對這9個灰度從小到大依次與 w1、w2、w3、w4、w5、w6、w7、w8、w9相乘後相加得 A, 令 A 與各權重之和的倒數相乘,得列權值矩陣。
(6)將構成的權值矩陣與它所重合的像素灰度值相乘,把全部的乘積求和,將這個值賦給對應模板中心位置的像素。使灰度相近的鄰點參與平均的比重大,對模板中心 和較近的元素能夠賦予大的加權值。
源代碼:
% x是須要濾波的圖像,n是模板大小(即n×n)
function d=wavg_filter(x,n)
[height, width]=size(x); %輸入圖像是height,width的,且height>n,width>n
x1=double(x);
new_image=ones(size(x1));
x2=x1;
for i=2:height-n+1 %從2開始,不能從1開始,由於這樣i-1=0了,x(0,1)這樣不能夠的
for j=2:width-n+1
%若是w1,w2……w9取相同的值的時候就是均值濾波器 n=3 3*3
%H3[i,j]=[(i-1,j-1),(i-1,j),(i-1,j+1);(i,j-1),(i,j),(i,j+1);(i+1,j-1),(i+1,j),(i+1,j+1)]
%x2(i,j)座標
%爲了去除噪聲更多一些,w1-w9取值更均勻一些
%f1,f2,f3,f4,f5,f6,f7,f8,f9分別表示(i-1,j-1),(i-1,j),(i-1,j+1),(i,j-1),(i,j),(i,j+1),(i+1,j-1),(i+1,j),(i+1,j+1)的權值
%f=f1+f2+f3+f4+f5+f6+f7+f8+f9 表示權值之和
%w1=f1/f,w2=f2/f,w3=f3/f,w4=f4/f,w5=f5/f,w6=f6/f,w7=f7/f,w8=f8/f,w9=f9/f表示權重
%w=w1+w2+w3+w4+w5+w6+w7+w8+w9; %權重之和爲1;
%加權均值濾波器 想要什麼就把誰的權值加劇 w1=0.1;w2=0.1;w3=0.1;w4=0.2;w5=0.1;w6=0.1;w7=0.1;w8=0.1;w9=0.1;
A=x2(i-1,j-1)*w1 +x2(i-1,j)*w2 +x2(i-1,j+1)*w3 +x2(i,j-1)*w4+x2(i,j)*w5+x2(i,j+1)*w6+x2(i+1,j-1)*w7+x2(i+1,j)*w8+x2(i+1,j+1)*w9;
new_image(i,j)=A;
x2(i+(n-1)/2,j+(n-1)/2)=new_image(i,j); %將與模板運算後的各元素的均值賦給模板中心位置的元素
end
end
%未被賦值的元素取原值
5、實驗結果和分析
一、實驗結果:
(1)n=3均值濾波器
(2)n=5均值濾波器
(3)n=9均值濾波器
(4)自定義均值濾波器
(5)加權均值濾波器
二、結果分析:
(1)均值濾波器,平滑的效果和所採用領域的半徑(模板)有關,半徑越大,則圖像的模糊程度越大。
(2)加權均值濾波,須要提早設置權值,想要哪一個像素點,就把哪一個的權值加劇。此外加權均值濾波器不能去掉噪聲,只能只是模糊和銳化。
(3)自定義的濾波器函數比系統自帶的函數性能高一些,這是通過屢次試驗得出的結論。
6、實驗心得
剛開始接觸MATLAB,那就是一頭霧水,找不到方向不知道從何處入手,後來查了一些資料和身邊一些從事這方面的同窗朋友,才發現它原來是處理圖像的最好的工具。MATLAB中的函數的寫法相似C,可是和C仍是不同的,好比在MATLAB中是從第1個開始的,沒有第0個的概念,若是你取值f(0,1),運行就會提示索引應該爲正整數或者邏輯數。對於加權均值濾波器,權值很差取,須要根據一些計算和偏差分析等,須要大量實驗才能取得合適的值。接觸了幾天後,慢慢熟悉了,感受MATLAB是一個好的工具,對於數學建模,數學中的一些計算,各類公式和函數的計算都很方便,最重要的是對處理圖像很是的好。如今圖像處理在人工智能,地理測繪,醫學成像等各個領域研究應用很是普遍,使用它很是方便的,很是精細專業。 在咱們現實生活中,咱們瞭解了一個圖像實際上就是一個矩陣,每一個像素點就是一個座標,想讓某個模糊的地方復原就是讓它和它附件的區域取值同樣,把不一樣地方設置同樣的值就能夠,對於彩色的照片咱們能夠設置灰度值變成黑白的。咱們瞭解這些原理以後,能夠對本身的照片進行處理,修復受損的照片和將彩色的照片變成黑白的,比PS好用多了。
實驗二多種濾波器的比較
1、實驗目的
使用MATLAB處理圖像,掌握各類濾波器的使用(例如:均值濾波器、加權均值濾波器、中值濾波器、高斯濾波器),對比各類濾波器對圖像處理結果,找出它們對各類噪聲(例如:椒鹽噪聲、高斯噪聲、脈衝噪聲)處理最佳。
2、實驗內容
使用均值濾波器、加權均值濾波器、中值濾波器、高斯濾波器對圖像Fig2的進行去除脈衝噪音處理。觀察對比這幾種濾波器對該圖像的結果,分析實驗結果和算法特色,找出一種最好的處理脈衝噪聲的濾波器或者算法。
3、實驗原理
一、均值濾波器(平滑線性濾波器):其響應是包含模板內像素平均值,低通濾波器。
R = (領域內全部點的值*對應點的掩模係數之和)/(掩模係數之和)
g(x,y)=1/n∑f(x,y) n爲該模板中包含當前像素在內的像素總個數
二、加權均值濾波器:加權均值濾波算法是一種有效的去除高 斯噪聲的算法。
若是領域內掩模係數不等,則這個掩模叫加權平均。從權值上看每一個像素的重要性不等,權值越大代表這個像素越重要。
R=(權值*對應像素灰度值全部之和)/(權值之和)
g(x,y)=∑w(s,t)∑f(x,y)/(∑∑w(s,t)) w爲權值
三、中值濾波器:用該像素鄰域內像素灰度的中值代替該像素的值。
F(x,y)=mid{g(s,t)}
中值濾波器對處理脈衝噪聲(黑白點)很是有效。
四、高斯濾波器:一種線性平滑濾波,適用於消除高斯噪聲,用一個模板(或稱卷積、掩模)掃描圖像中的每個像素,用模板肯定的鄰域內像素的加權平均灰度值去替代模板中心像素點的值。
五、涉及到系統函數:
Imread()讀取圖像,imshow()顯示圖像,double和unit8用來處理圖像轉換爲矩陣以後數據和顯示,size輸出圖像高和寬,floor()計算中心點,fspecial()生成系統濾波,filter2()
均值濾波,medfilt2()中值濾波
filter_avg_3x3 = [1 1 1;
1 1 1;
1 1 1];
filter_avg_5x5 = [1 1 1 1 1;
1 1 1 1 1;
1 1 1 1 1;
1 1 1 1 1;
1 1 1 1 1];
filter_avg_9x9 = [1 1 1 1 1 1 1 1 1;
1 1 1 1 1 1 1 1 1;
1 1 1 1 1 1 1 1 1;
1 1 1 1 1 1 1 1 1;
1 1 1 1 1 1 1 1 1;
1 1 1 1 1 1 1 1 1;
1 1 1 1 1 1 1 1 1;
1 1 1 1 1 1 1 1 1;
1 1 1 1 1 1 1 1 1 ];
filter_w_avg_3x3 = [1 2 1;
2 4 2;
1 2 1];
filter_w_avg_5x5 = [1 2 4 2 1;
2 4 16 4 2;
4 16 256 16 2;
2 4 16 6 2;
1 2 4 2 1];
4、實驗步驟
一、使用均值濾波器處理圖像Fig2
源代碼:根據算法自定義函數
% x是須要濾波的圖像,n是模板大小(即n×n)
function d=avg_filter(x,n)
a(1:n,1:n)=1; %a即n×n模板,元素全是1
[height, width]=size(x); %輸入圖像是height,width的,且height>n,width>n
x1=double(x);
x2=x1;
for i=1:height-n+1 %等價於for i=n:height
for j=1:width-n+1
c=x1(i:i+(n-1),j:j+(n-1)).*a; %取出x1中從(i,j)開始的n行n列元素與模板相乘
s=sum(sum(c)); %求c矩陣中各元素之和
x2(i+(n-1)/2,j+(n-1)/2)=s/(n*n); %將與模板運算後的各元素的均值賦給模板中心位置的元素
end
end
%未被賦值的元素取原值
d=uint8(x2);
二、使用加權均值濾波器處理圖像Fig2
源代碼:根據算法自定義函數
% x是須要濾波的圖像,n是模板大小(即n×n)
function d=wavg_filter(x,n)
[height, width]=size(x); %輸入圖像是height,width的,且height>n,width>n
x1=double(x);
new_image=ones(size(x1));
x2=x1;
for i=2:height-n+1 %從2開始,不能從1開始,由於這樣i-1=0了,x(0,1)這樣不能夠的
for j=2:width-n+1
%若是w1,w2……w9取相同的值的時候就是均值濾波器 n=3 3*3
%H3[i,j]=[(i-1,j-1),(i-1,j),(i-1,j+1);(i,j-1),(i,j),(i,j+1);(i+1,j-1),(i+1,j),(i+1,j+1)]
%爲了去除噪聲更多一些,w1-w9取值更均勻一些
%f1,f2,f3,f4,f5,f6,f7,f8,f9分別表示(i-1,j-1),(i-1,j),(i-1,j+1),(i,j-1),(i,j),(i,j+1),(i+1,j-1),(i+1,j),(i+1,j+1)的權值
%f=f1+f2+f3+f4+f5+f6+f7+f8+f9 表示權值之和
%w1=f1/f,w2=f2/f,w3=f3/f,w4=f4/f,w5=f5/f,w6=f6/f,w7=f7/f,w8=f8/f,w9=f9/f表示權重
%w=w1+w2+w3+w4+w5+w6+w7+w8+w9; %權重之和爲1;
%加權均值濾波器 想要什麼就把誰的權值加劇
w1=0.1;w2=0.1;w3=0.1;w4=0.2;w5=0.1;w6=0.1;w7=0.1;w8=0.1;w9=0.1;
A=x2(i-1,j-1)*w1 +x2(i-1,j)*w2 +x2(i-1,j+1)*w3 +x2(i,j-1)*w4+x2(i,j)*w5+x2(i,j+1)*w6+x2(i+1,j-1)*w7+x2(i+1,j)*w8+x2(i+1,j+1)*w9;
new_image(i,j)=A;
x2(i+(n-1)/2,j+(n-1)/2)=new_image(i,j); %將與模板運算後的各元素的均值賦給模板中心位置的元素
end
end
%未被賦值的元素取原值
d=uint8(x2);
三、使用中值濾波器處理圖像Fig2
源代碼:根據算法自定義函數
%自編的中值濾波函數。x是須要濾波的圖像,n是模板大小(即n×n)
function d=mid_filter(x,n)
[height, width]=size(x); %輸入圖像是p×q的,且p>n,q>n
x1=double(x);
x2=x1;
for i=1:height-n+1
for j=1:height-n+1
c=x1(i:i+(n-1),j:j+(n-1)); %取出x1中從(i,j)開始的n行n列元素,即模板(n×n的)
e=c(1,:); %是c矩陣的第一行
for u=2:n
e=[e,c(u,:)]; %將c矩陣變爲一個行矩陣
end
mm=median(e); %mm是中值
x2(i+(n-1)/2,j+(n-1)/2)=mm; %將模板各元素的中值賦給模板中心位置的元素
end
end
%未被賦值的元素取原值
d=uint8(x2);
四、使用高斯濾波器處理圖像Fig2
源代碼:根據算法自定義函數
%自編的高斯濾波函數,S是須要濾波的圖象,n是均值,k是方差
function d=gaussfilt(k,n,s)
Img = double(s);
n1=floor((n+1)/2);%計算圖象中心
for i=1:n
for j=1:n
b(i,j) =exp(-((i-n1)^2+(j-n1)^2)/(4*k))/(4*pi*k);
end
end
%生成高斯序列b。
Img1=conv2(Img,b,'same'); %用生成的高斯序列卷積運算,進行高斯濾波
d=uint8(Img1);
5、實驗結果和分析
該圖像對應的直方圖和轉換爲矩陣的部分片斷:
一、實驗結果:
(1)均值濾波器處理結果:
(2)加權均值濾波器處理結果:
(3)中值濾波器處理結果:
(4)高斯濾波器處理結果:
二、結果分析:
(1)模板越大,處理越模糊;
(2)幾種濾波器處理結果對比,中值濾波器對處理脈衝噪聲(黑白點)很是有效;
(3)線性濾波器對處理高斯噪聲效果很好,可是對椒鹽噪聲、脈衝噪聲效果通常,它的主要問題是有可能模糊圖像中的尖銳,不連續的部分。非線性濾波器,對濾出脈衝噪聲的效果最好。
6、實驗心得
處理圖像,MATLAB中給的函數處理不能知足需求,須要對已有的算法進行修改,找到一個適合的最佳的算法。不少算法都是須要進行屢次試驗,記錄每次試驗的結果,對結果進行分析,找到合適的方法。