基本概念
(1)γ校正:由於數字顯示設備的非線性轉換特征,使得圖像的顯示與原始場景相比較而言發生偏暗或偏亮的現象,這個時候就可以采用γ校正進行處理,使圖像的顯示等於或接近原始場景。消除圖像噪聲是圖像增強、恢復的內容之一。
(2)圖像平滑去噪:在常見的圖像處理軟件中,都提供了常用的除噪功能,其中,空間域的平滑操作最常見。在Matlab中可以實現均值濾波和中值濾波。
(3)圖像銳化:圖像銳化的目的是突出圖像的細節,或者是增強被模糊的細節,這種模糊是在數據獲取過程中,由於操作失誤導致或經過特殊方法處理后的結果。在matlab中可以實現在空間域的圖像銳化,根據一階和二階微分算子,設計不同的模板,對圖像進行微分計算。
1. γ校正:
(1)准備一幅8bit(256色)的灰度圖像。如果是彩色圖像,可利用rgb2gray函數轉換為灰度圖像。
(2)讀取圖像,用函數imadjust對圖像進行校正,如下:
(3)用不同的γ值,重復(2),得到處理后的圖像I1,I2,I3,…等。
(4)用subplot在同一個窗口中顯示I,I1,I2,I3,…,以及它們的直方圖。
【代碼】
1. I=imread('pic1.jpg');
2. H=rgb2gray(I);
3. subplot(2,1,1);imshow(H);
4. subplot(2,1,2);imhist(H);
5. i=1;
6. for gamma=0.3:0.2:0.9
7. G=imadjust(H,[0 1],[0 1],gamma);
8. subplot(4,2,i);imshow(G);
9. i=i+1;
10. subplot(4,2,i);imhist(G);
11. i=i+1;
12.end
2.噪聲的消除
關於對於邊界數據的處理:
(1)忽略邊界數據
(2)拓展圖像(四周補上數據)
使用P值填充(如:P=0)
復制圖像邊界像素的值
鏡像圖像邊界像素的值
周期擴展
關於兩種方法的優劣
1.忽略邊界數據
優點:濾波后的圖像中所有像素點都能由整個模版處理
缺點:處理后的圖像比原始圖像小,輸出的圖像尺寸=n-w+1,w為模板的大小,但這里我們通過跳過邊緣這些值來使得圖像的大小不變。
2.拓展圖像
優點:與原圖的尺寸相等
缺點:若擴展方法不當,補在靠近圖像邊緣的部分會給處理后的圖像帶來不良影響,而且會隨着濾波器尺寸的增加而增大
這里不論是均值濾波還是中值濾波,都直接采用忽略邊界值的方法,因此從第二行、第二列開始,對每一像素求的相鄰9個像素的均值來替代原像素,直到處理完倒數第二行、第二列的所有像素,同時跳過邊緣的數據,得到除噪后的圖像。
(1)均值濾波
【代碼】
1. %avefilter.m
2. function G=avefilter(F,k)
3. %F 是待處理的圖像
4. %k 是模版的大小,奇數
5. [m,n]=size(F);
6. %得到待處理圖像F的大小
7.
8. %轉換數據類型,便於計算
9. G=uint16(zeros(m,n));Ft=uint16(F);M=uint16(ones(k,k));
10.h=(k+1)/2;
11.for i=1:m
12. for j=1:n
13. if((i<h)||(j<h)||(i>m-h+1)||(j>n-h+1)) %不能被模版處理的區域
14. G(i,j)=Ft(i,j);continue; %像素值不變
15. end
16.
17.%取和模板同樣大小的圖像塊,中間的像素是待處理的像素
18. T=Ft(i-(k-1)/2:i+(k-1)/2,j-(k-1)/2:j+(k-1)/2);
19. T=T.*M; %和模版相乘
20. G(i,j)=sum(T(:))/k^2; %結果求和並計算平均值
21. end
22.end
23.G=uint8(G); %結果轉換成8-bit圖像的數據類型
新建一個avefiltertest腳本來測試avefilter函數:
1. %aveflitertest
2. clear;
3.
4. F=imread('peppers2.jpg'); % 導入圖像
5. F1=rgb2gray(F);
6. Fn=imnoise(F1,'salt & pepper',0.05); %給圖像添加椒鹽噪聲
7. %Fn=imnoise(F1,'gaussian',0,0.01); %給圖像添加高斯噪聲
8.
9. subplot(2,3,1),imshow(F1);title('原圖像') %畫出原圖像
10. subplot(2,3,2),imshow(Fn);title('添加噪聲后的圖像') %畫出帶噪音的圖像
11.
12. %3*3 average filter
13. OUT1=avefilter(Fn,3);
14. subplot(2,3,3),imshow(OUT1);title('3*3均值濾波結果')
15.
16. %7*7 median filter
17. OUT2=avefilter(Fn,7);
18. subplot(2,3,4),imshow(OUT2);title('7*7均值濾波結果')
19.
20. %9*9 median filter
21. OUT3=avefilter(Fn,9);
22. subplot(2,3,5),imshow(OUT3);title('9*9均值濾波結果')
23.
24. %11*11 median filter
25. OUT4=avefilter(Fn,11);
26. subplot(2,3,6),imshow(OUT4);title('11*11均值濾波結果')
(2)中值濾波
【代碼】
1. %medianfilter
2. function d=medianfilter(x,n)
3. p=size(x); %輸入圖像是p×q的,且p>n,q>n
4. x1=double(x);
5. x2=x1;
6. for i=1:p(1)-n+1
7. for j=1:p(2)-n+1
8. c=x1(i:i+(n-1),j:j+(n-1)); %取出x1中從(i,j)開始的n行n列元素,即模板(n×n的)
9. e=c(1,:); %是c矩陣的第一行
10. for u=2:n
11. e=[e,c(u,:)]; %將c矩陣變為一個行矩陣
12. end
13. mm=median(e); %mm是中值
14. x2(i+(n-1)/2,j+(n-1)/2)=mm;
15. end
16.end
17.d=uint8(x2);
新建一個medianfiltertest腳本來測試medianfilter函數,類似於均值濾波的測試函數,將調用的avefilter替換為medianfilter。
分析:
均值濾波中,模板越大,圖像的細節越不清晰,圖像越模糊。中值濾波中,模板的大小對圖像細節與清晰度的影響較均值濾波相對較小。同時,均值濾波對高斯噪聲處理效果更好,中值濾波對椒鹽噪聲處理效果更佳。
因為椒鹽噪聲的幅值基本是相同的,只是出現噪聲點的位置是隨機的,所以在統計意義下的噪聲均值也不為零,因此,即使理想狀況下,也無法完全去除噪聲;而且,經過均值處理之后,噪聲部分被弱化到周圍像素點上,所以得到的結果是噪聲幅值減小,但是噪聲點的顆粒面積同時變大,所以效果不好。但是如果用中值濾波處理椒鹽噪聲,可以找到椒鹽噪聲點周圍像素的中值從而來代替改噪聲點,不會擴大噪聲點的范圍,所以效果會比均值濾波好。
高斯噪聲的幅值大小不定,如果用中值濾波可能會使周圍的正常點受到影響,但是用均值濾波的話,可以直接使用噪聲點及其周圍的點的均值來代替噪聲點,效果比用中值濾波好。因此,均值濾波對高斯噪聲有較好的抑制作用,而對於椒鹽噪聲的處理,中值濾波較有優勢
3.圖像的銳化
(1)利用一階微分算子銳化圖像
【代碼】
1. %sharpen1
2. function G=sharpen1(F,Dx,Dy)
3. [m,n]=size(F); %獲取圖像大小
4. [N,N]=size(Dx); %獲取模板大小
5. h=(N+1)/2;
6.
7. for i=1:m
8. for j=1:n
9. if((i<h)||(j<h)||(i>m-h+1)||(j>n-h+1))
10. G(i,j)=double(F(i,j)); %圖像不能被處理的區域
11. continue;
12. end
13. T=double(F(i-h+1:i+h-1,j-h+1:j+h-1));
14. T1=Dx.*T;
15. T2=Dy.*T;
16. G(i,j)=(sum(sum(T1))^2+sum(sum(T2))^2)^0.5;
17. end
18.end
19.
20.%將計算結果調整到[0,255]的范圍
21.Min = min(G(:));
22.Max = max(G(:));
23.s=255/(Max-Min);
24.G = uint8((G-Min)*s);
新建一個testsharpen1腳本,調用一階微分算子函數對圖像進行處理
【代碼】
1. clear;
2. F=imread('gull.jpg');
3.
4. Dx=[1 2 1;0 0 0;-1 -2 -1];
5. Dy=zeros(3,3);
6. G=sharpen1(F,Dx,Dy);
7. S=F+G;
8. subplot(4,2,1),imshow(G);title('水平微分算子提取的輪廓');
9. subplot(4,2,2),imshow(S);title('水平微分算子銳化后的疊加圖像');
10.
11.Dx=zeros(3,3);
12.Dy=[1 0 -1;2 0 -2;1 0 -1];
13.G1=sharpen1(F,Dx,Dy);
14.S1=F+G1;
15.subplot(4,2,3),imshow(G1);title('垂直微分算子提取的輪廓');
16.subplot(4,2,4),imshow(S1);title('垂直微分算子銳化后的疊加圖像');
17.
18.Dx=[-1 0 -1;-1 0 -1;-1 0 -1];
19.Dy=[-1 -1 -1;0 0 0;1 1 1];
20.G2=sharpen1(F,Dx,Dy);
21.S2=F+G2;
22.subplot(4,2,5),imshow(G2);title('priwitt微分算子提取的輪廓');
23.subplot(4,2,6),imshow(S2);title('priwitt微分算子銳化后的疊加圖像');
24.
25.Dx=[-1 0 1;-2 0 2;-1 0 1];
26.Dy=[-1 -2 -1;0 0 0;1 2 1];
27.G3=sharpen1(F,Dx,Dy);
28.S3=F+G3;
29.subplot(4,2,7),imshow(G3);title('sobel微分算子提取的輪廓');
30.subplot(4,2,8),imshow(S3);title('sobel微分算子銳化后的疊加圖像');
(2)利用二階微分算子處理圖像
【代碼】
2. function G=laplacian(F,D)
3. [m,n]=size(F); %圖像大小
4. [N,N]=size(D); %模板大小
5. h=(N+1)/2;
6. for i=1:m
7. for j=1:n
8. if((i<h)||(j<h)||(i>m-h+1)||(j>n-h+1))
9. G(i,j)=double(F(i,j)); %圖像不能被處理的區域
10. continue;
11. end
12. T=double(F(i-h+1:i+h-1,j-h+1:j+h-1));
13. TR=D.*T;
14. G(i,j)=abs(sum(sum(TR)));
15. end
16.end
17.Min = min(G(:));
18.Max = max(G(:));
19.s=255/(Max-Min);
20.G = uint8((G-Min)*s);
建立一個testLaplacian腳本,調用Laplacian函數
【代碼】
1. %testlaplacian.m
2. H=imread('gull.jpg'); %讀取8bit的RGB圖像
3. subplot(1,3,1),imshow(H);
4. title('原圖像');
5.
6. D=[0 -1 0;-1 4 -1;0 -1 0];
7. G=laplacian(H,D);
8. subplot(1,3,2),imshow(G);
9. title('二階微分Laplacian算子輪廓');
10.
11.S=G+H;
12.subplot(1,3,3),imshow(S);
13.title('二階微分Laplacian算子銳化疊加');
4.圖像的去噪與銳化的組合
先用均值濾波器去除噪聲,然后用Laplacian算子銳化
【代碼】
1. F=imread('building.jpg');
2. subplot(3,2,1),imshow(F);
3. title('building');
4.
5. %加上高斯噪聲
6. Fn=imnoise(F, 'gaussian',0.05);
7. subplot(3,2,3),imshow(Fn);
8. title('添加高斯噪聲');
9.
10.%用均值濾波器去除噪聲
11.G=avefilter(Fn,3);
12.subplot(3,2,5),imshow(G);
13.title('用均值濾波器去除噪聲');
14.
15.%用Laplacian算子銳化
16.D=[0 -1 0;-1 4 -1;0 -1 0];
17.H=laplacian(G,D);
18.subplot(3,2,4),imshow(H);
19.title('用Laplacian算子銳化');
20.
21.%圖像疊加
22.K = imadd(F,H,'uint16');
23.subplot(3,2,6);
24.imshow(K,[]);
25.title('銳化圖像疊加');
先用Laplacian算子銳化,然后用均值濾波器去除噪聲
【代碼】
1. F=imread('building.jpg');
2. subplot(3,2,1),imshow(F);
3. title('building');
4.
5. %加上高斯噪聲
6. Fn=imnoise(F, 'gaussian',0.05);
7. subplot(3,2,3),imshow(Fn);
8. title('添加高斯噪聲');
9.
10.%用Laplacian算子銳化
11.D=[0 -1 0;-1 4 -1;0 -1 0];
12.H=laplacian(Fn,D);
13.subplot(3,2,5),imshow(H);
14.title('用Laplacian算子銳化');
15.
16.%用均值濾波器去除噪聲
17.G=avefilter(H,3);
18.subplot(3,2,4),imshow(G);
19.title('用均值濾波器去除噪聲');
20.
21.%圖像疊加
22.K = imadd(F,G,'uint16');
23.subplot(3,2,6);
24.imshow(K,[]);
25.title('圖像疊加')
5.相同的直方圖的兩幅不同的圖像3*3均值濾波
(1) 生成一半為黑,一半為白的圖像
建立一個生成一半為黑,一半為白的圖像
【代碼】
1. function img = writehalf(width,height)
2. for i=1:width
3. for j=1:height/2
4. img(i,j)=255;
5. end
6. end
7. for i=1:width
8. for j=height/2+1:height
9. img(i,j)=0;
10. end
11.end
(2) 生成棋盤格圖像
建立一個生成棋盤格的函數
【代碼】
1. function chess = writeChess(width,height,xNum,yNum)
2. %width 單元格寬度,以像素為單位
3. %height 單元格高度,以像素為單位
4. %xNum 棋盤格橫向單元格個數
5. %yNum 棋盤格縱向單元格個數
6. for row = 1 : xNum
7. for col = 1 : yNum
8. up = row*height-height+1;
9. down = row*height;
10. left = width*col-width+1;
11. right = width*col;
12. if mod((row+col),2)
13. chess(up:down,left:right) = 0;
14. else
15. chess(up:down,left:right) = 255;
16. end
17. end
18.end
19.end
調用兩個函數對不同大小的的圖像一和圖像二進行處理,並繪制處理前后的圖像以及其直方圖。
分析:
圖像1和圖像2在濾波處理之前的直方圖是一樣的,當尺寸為8*8時,圖像1濾波后的直方圖中灰度值為0和255的都有26個像素,灰度值為85和170的都有6個像素;圖像2濾波后的直方圖中灰度值為0和255均有14個像素,灰度值為113和142的都有18個像素。
通過對比兩幅濾波過后的圖像,發現結果也不同:圖像一是黑白交界處出現了兩種灰色的像素,但是圖像二的在圖像的中心部分,除了最外層的一圈28個像素沒有變換之外,中間的正方形內像素都發生了灰度上的變化。
當圖像尺寸增加到24*24及更大時,圖一的直方圖的形態沒有變化,圖二的直方圖的形態發生了變化。且當尺寸不斷增大時,中間的兩個灰度值的元素所占的比例逐漸減小。
