天天看點

基于matlab的數字圖像處理

MATLAB支援以下幾種圖像檔案格式:

(1)PCX(Windows Paintbrush)格式。可處理1,4,8,16,24位等圖像資料。檔案内容包括:檔案頭(128位元組),圖像資料、擴充顔色映射表資料。

(2)BMP(Windows Bitmap)格式。有1,4,8,24位非壓縮圖像,8位RLE(Run-length Encoded )圖像。檔案内容包括:檔案頭(一個BITMAP FILEHEADER資料結構),位圖資訊資料塊(位圖資訊頭BITMAP INFOHEADER和一個顔色表)和圖像資料。

(3)HDF(Hierarchical Data Format)格式。有8位,24位光栅資料集。

(4)JPEG(Joint Photographic Experts Group)格式,是一種成為聯合圖像專家組的圖像壓縮格式。

(5)TIFF(Tagged Image File Format)格式。處理1,4,8,24位非壓縮圖像,1,4,8,24位packbit壓縮圖像,一位CCITT壓縮圖像等。檔案内容包括:檔案頭,參數指針表與參數域,參數資料表和圖像資料四部分。

(6)XWD(X Windows Dump)格式。1,8位Zpixmaps,XYbitmaps,1位XYpixmaps。

(7)PNG(Portable Network Graphics)格式。

2.3.2 圖像類型

MATLAB中,一幅圖像可能包含一個資料矩陣,也可能包含一個顔色映射表矩陣。MATLAB中有四種基本的圖像類型:

(1)索引圖像

索引圖像包括圖像矩陣與顔色圖數組,其中,顔色圖是按圖像中顔色值進行排序後的數組。對于每個像素,圖像矩陣包含一個值,這個值就是顔色圖中的索引。顔色圖為m*3雙精度值矩陣,各行分别指定紅綠藍(RGB)單色值。Colormap=[R,G, B],R,G,B為值域為[0,1]的實數值。

圖像矩陣與顔色圖的關系依賴于圖像矩陣是雙精度型還是uint8(無符号8位整型)類型。如果圖像矩陣為雙精度類型,第一點的值對應于顔色圖的第一行,第二點對應于顔色圖的第二行,依次類推。如果圖像矩陣是uint8,有一個偏移量,第0點值對應于顔色圖的第一行,第一點對應于第二行,依次類推;uint8長用于圖形檔案格式,它支援256色。

(2)灰階圖像

在MATLAB中,灰階圖像是儲存在一個矩陣中的,矩陣中的每一個元素代表一個像素點。矩陣可以是雙精度類型,其值域為[0,1];也可以為uint8類型,其資料範圍為[0,255]。矩陣的每個元素代表不同的亮度或灰階級。

(3)二進制圖像

二進制圖像中,每個點為兩離散值中的一個,這兩個值代表開或關。二進制圖像儲存在一個由二維的由0(關)和1(開)組成的矩陣中。從另一個角度講,二進制圖像可以看成為一個僅包括黑與白的灰階圖像,也可以看作隻有兩種顔色的索引圖像。

二進制圖像可以儲存為雙精度或uint8類型的雙精度數組,顯然使用uint8類型更節省空間。在圖像處理工具箱中,任何一個傳回二進制圖像的函數都是以uint8類型邏輯數組來傳回的。

(4)RGB圖像

與索引圖像一樣,RGB圖像分别用紅,綠,藍三個亮度值為一組,代表每個像素的顔色。與索引圖像不同的是,這些亮度值直接存在圖像數組中,而不是存放在顔色圖中。圖像數組為M*N*3,M,N表示圖像像素的行列數。

圖像增強是一類基本的圖像處理技術,其目的是對圖像進行加工,以得到對具體應用來說視覺效果更好、更有用的圖像。這裡的好和有用要因具體的應用目的和要求而異,并且所需的具體增強技術也可不同。

目前常用的增強技術根據其處理所進行的空間不同,可分為基于圖像域的方法和基于變化域的方法。第一類,直接在圖像所在的空間進行處理,也就是在像素組成的空間裡直接對像素進行操作;第二類,在圖像的變化域對圖像進行間接處理。

空域增強方法可表示為:g(x,y)=EH[f(x,y)]

其中f(x,y)和g(x,y)分别為增強前後的圖像,EH代表增強操作。

在圖4.1.1中可以看出,通過變換可以使原圖的較高的和較低的灰階值的動态範圍減小了,而原圖在二者之間的動态範圍增加了,進而其範圍的對比度增加了。

MATLAB代碼所示:

X1=imread('pout.tif');
figure,imshow(X1)
f0=0;g0=0;
f1=70;g1=30;
f2=180;g2=230;
f3=255;g3=255;
r1=(g1-g0)/(f1-f0);
b1=g0-r1*f0;
r2=(g2-g1)/(f2-f1);
b2=g1-r2*f1;
r3=(g3-g2)/(f3-f2);
b3=g2-r3*f2;
[m,n]=size(X1);
X2=double(X1);
for i=1:m
   for j=1:n
      f=X2(i,j);
      g(i,j)=0;
      if(f>=0)&(f<=f1)
      g(i,j)=r1*f+b1;
      elseif (f>=f1)&(f<=f2)
      g(i,j)=r2*f+b2;
      elseif (f>=f2)&(f<=f3)
      g(i,j)=r3*f+b3;
      end
   end
end
figure,imshow(mat2gray(g))      

圖像處理圖示(如圖4-2和圖4-3)

基于matlab的數字圖像處理
基于matlab的數字圖像處理

圖4-2  原圖                        圖4-3增強對比度所得圖像

對圖像求反是将原來的灰階值翻轉,簡單的說就是使黑變白,使白變黑。

普通的黑白底片和照片就是這樣的關系。具體的變換就是将圖像中每個像素的灰階值根據變換曲線進行映射。

MATLAB代碼所示:

X1=imread('pout.tif');
f1=200;
g1=256;
k=g1/f1;
[m,n]=size(X1);
X2=double(X1);
for i=1:m 
  for j=1:n
     f=X2(i,j);
     g(i,j)=0;
     if(f>=0)&(f<=f1)
      g(i,j)=g1-k*f;
     else
      g(i,j)=0;
     end
   end
end
figure,imshow(mat2gray(g))      

圖像處理圖如圖4-4所示:

基于matlab的數字圖像處理

4.2 空域濾波增強

一般情況下,像素的鄰域比該像素要大,也就是說這個像素的鄰域中除了本身以外還包括其他像素。在這種情況下,g(x,y)在(x,y)位置處的值不僅取決于f(x,y)在以(x,y)為中心的鄰域内所有的像素的值。如仍以s和t分别表示f(x,y)在(x,y)位置處的灰階值,并以n(s)代表f(x,y)在(x,y)鄰域内像素的灰階值,則 t=EA[s,n(s)]

為在鄰域内實作增強操作,常可利用模闆與圖像進行卷積。每個模闆實際上是一個二維數組,其中各個元素的取值定了模闆的功能,這種模闆操作也稱為空域濾波。

4.2.1 基本原理

空域濾波可分為線形濾波和非線形濾波兩類。

線形濾波器的設計常基于對傅立葉變換的分析。

非線形空域濾波器則一般直接對鄰域進行操作。

另外各種濾波器根據功能又主要分成平滑濾波和銳化濾波。平滑可用低通來實作,銳化可用高通來實作

平滑濾波器:它能減弱或消除傅立葉空間的高頻分量,但不影響在低頻分量。因為高頻分量對應圖像中的區域邊緣等灰階值具有較大較快變化的部分,濾波器将這些分量濾去可使圖像平滑。

銳化濾波器:它能減弱或消除傅立葉空間的高頻分量

空域濾波器都是利用模闆卷積,主要步驟如下:

(1)将模闆在圖中漫遊,并将模闆中心與圖中某個像素位置重合;

(2)将模闆上的系數與模闆下對應的像素相乘;

(3)将所有的乘積相加;

(4)将和(模闆的輸出響應)賦給圖中對應的模闆中心位置像素。

下面分别介紹在MATLAB中如何應用平滑和銳化濾波器。

4.2.2 線性平滑濾波器

線性低通濾波器是最常用的線性平滑濾波器。這種濾波器的所有系數都是正的。對3*3的模闆來說,最簡單的操作是取所有系數都為1。為保證輸出圖像仍在原來的灰階範圍内,在計算R後要将其除以9再進行指派。這種方法稱為鄰域平均法。

MATLAB實作均值過濾器的代碼所示:

I=imread('saturn.tif');
J=imnoise(I,'salt & pepper',0.02);
imshow(I)
figure,imshow(J)
K1=filter2(fspecial('average',3),J)/255;
figure,imshow(K1)
title('3*3的均值濾波器')      

圖4-4 圖像求反後

原圖像,加入椒鹽噪聲的圖像和均值濾波的圖像分别如圖4-5、圖4-6和圖4-7所示。

基于matlab的數字圖像處理
基于matlab的數字圖像處理

圖4-5 原圖                        圖4-6加入椒鹽噪聲圖像

基于matlab的數字圖像處理

圖4-7   3*3的均值濾波器處理結果

中值濾波器是最常用的非線性平滑濾波器。它是一種臨域運算,類似于卷積,但計算的不是權重求和,而是把鄰域中的像素按灰階級進行排序,然後選擇改組的中間值作為輸出的像素值。具體步驟:

(1)将模闆在圖像中漫遊,并将模闆中心和圖像某個像素的位置重合;

(2)讀取模闆下對應像素的灰階值;

(3)将這些灰階值從小到大排成一列;

(4)找出這些值排在中間的一個;

(5)将這個中間值賦給對應模闆中心位置的像素。

MATLAB實作中值濾波器代碼所示:

I=imread('saturn.tif');

J=imnoise(I,'salt & pepper',0.02);

K1=medfilt2(J,[3,3]);

figure,imshow(K1)

中值濾波的結果如圖4-8所示。

基于matlab的數字圖像處理

圖4-8  中值濾波結果

線性高通濾波器是最常用的線性銳化濾波器。這種濾波器的中心系數都是正的,而周圍的系數都是負的。對3*3的模闆來說,典型的系數取值是:

[-1 –1 –1;-1  8 –1;-1 –1 -1]

事實上這是拉普拉斯算子,所有的系數之和為0。當這樣的模闆放在圖像中灰階值是常數或變化很小的區域時,其輸出為0或很小。這個濾波器将原來的圖像中的零頻域分量去除了,也就是将輸出的圖像的平均值變為0,這樣就會有一部分像素的灰階值小于0。在圖像進行中我們一般隻考慮正的灰階值,是以還有将輸出圖像的灰階值範圍通過尺度變回到所要求的範圍。

MATLAB代碼所示:

I=imread('saturn.tif');
m=fspecial('laplacian')
I1=filter2(m,I)
h=fspecial('unsharp',0.5);
I2=filter2(h,I)/255;
subplot(1,2,1);
imshow(I1);
title('高通濾波laplacian算子')
subplot(1,2,2);
imshow(I2);
title('高通濾波unsharp')