Matlab數字圖像處理(二)——圖像增強的基本操作(含代碼)


基本概念

(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)開始的nn列元素,即模板(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.%將計算結果調整到[0255]的范圍

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)利用二階微分算子處理圖像

【代碼】

1.  %Laplacian

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');    %讀取8bitRGB圖像

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濾波后的直方圖中灰度值為0255的都有26個像素,灰度值為85170的都有6個像素;圖像2濾波后的直方圖中灰度值為0255均有14個像素,灰度值為113142的都有18個像素。

通過對比兩幅濾波過后的圖像,發現結果也不同:圖像一是黑白交界處出現了兩種灰色的像素,但是圖像二的在圖像的中心部分,除了最外層的一圈28個像素沒有變換之外,中間的正方形內像素都發生了灰度上的變化。

當圖像尺寸增加到24*24及更大時,圖一的直方圖的形態沒有變化,圖二的直方圖的形態發生了變化。且當尺寸不斷增大時,中間的兩個灰度值的元素所占的比例逐漸減小。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM