1. 程式人生 > >matlab對影象操作函式的詳解(筆記1)

matlab對影象操作函式的詳解(筆記1)

matlab對影象操作函式的詳解

一. 讀寫影象檔案

1. imread

imread函式用於讀入各種影象檔案,如:a=imread('e:\w01.tif')

注:計算機E盤上要有w01相應的.tif檔案。

2. imwrite

imwrite函式用於寫入影象檔案,如:imwrite(a,'e:\w02.tif',’tif’)

3. imfinfo

imfinfo函式用於讀取影象檔案的有關資訊,如:imfinfo('e:\w01.tif')

二. 影象的顯示

1. image

image函式是MATLAB提供的最原始的影象顯示函式(主要彩色顯示圖象),如:

a=[1,2,3,4;4,5,6,7;8,9,10,11,12];

image(a);

2. imshow

imshow函式用於灰度影象檔案的顯示,如:

i=imread('e:\w01.tif');

imshow(i);

3. colorbar

colorbar函式用顯示影象的顏色條。

通常,顏色映象進行過調節,把資料從最小擴充套件到最大,也就是說整個顏色映象都用於繪圖。有時也許想改變顏色使用的方法。函式caxis代表顏色軸,因為顏色增加了另一個維數,它允許對資料範圍的一個子集使用整個顏色映象或者對資料的整個集合只使用當前顏色映象的一部分。

[cmin,cmax]=caxis返回對映到顏色映象中第一和最後輸入項的最小和最大的資料。它們通常被設成資料的最小值和最大值。比如,函式mesh(peaks) 會畫出函式peaks的網格圖,並把顏色軸caxis設為[-6.5466,8.0752],即Z的最小值和最大值。這些值之間的資料點,使用從顏色映象中經插值得到的顏色。如:

i=imread('e:\w01.tif');

imshow(i);

colorbar;

4 .figure

figure函式用於設定影象顯示視窗,如:figure(1); /figure(2);

5.imagesc(a);   caxis([-3 8]) ; colorbar;

標尺標度從-3,到8 顯示標度尺。

三. 影象的變換

1. fft2

fft2函式用於數字影象的二維傅立葉變換,如:

i=imread('e:\w01.tif');

j=fft2(i);

2. ifft2

ifft2函式用於數字影象的二維傅立葉反變換,如:

i=imread('e:\w01.tif');

j=fft2(i);

k=ifft2(j);

3. 利用fft2計算二維卷積

利用fft2函式可以計算二維卷積,如:

a=[8,1,6;3,5,7;4,9,2];

b=[1,1,1;1,1,1;1,1,1];

a(8,8)=0;

b(8,8)=0;

c=ifft2(fft2(a).*fft2(b));

c=c(1:5,1:5);

利用conv2(二維卷積函式)校驗, 如:

a=[8,1,6;3,5,7;4,9,2];

b=[1,1,1;1,1,1;1,1,1];

c=conv2(a,b);

四. 模擬噪聲生成函式和預定義濾波器

1. imnoise

imnoise函式用於對影象生成模擬噪聲,如:

i=imread('e:\w01.tif');

j=imnoise(i,'gaussian',0,0.02);%模擬高斯噪聲

2. fspecial

fspecial函式用於產生預定義濾波器,如:

h=fspecial('sobel');%sobel水平邊緣增強濾波器

h=fspecial('gaussian');%高斯低通濾波器

h=fspecial('laplacian');%拉普拉斯濾波器

h=fspecial('log');%高斯拉普拉斯(LoG)濾波器

h=fspecial('average');%均值濾波器

五. 影象的增強

1. 直方圖

imhist函式用於數字影象的直方圖顯示,如:

i=imread('e:\w01.tif');

imhist(i);

2. 直方圖均化

histeq函式用於數字影象的直方圖均化,如:

i=imread('e:\w01.tif');

j=histeq(i);

3. 對比度調整

imadjust函式用於數字影象的對比度調整,如:

i=imread('e:\w01.tif');

j=imadjust(i,[0.3,0.7],[]);

4. 對數變換

log函式用於數字影象的對數變換,如:

i=imread('e:\w01.tif');

j=double(i);

k=log(j);

5. 基於卷積的影象濾波函式

filter2函式用於影象濾波,如:

i=imread('e:\w01.tif');

h=[1,2,1;0,0,0;-1,-2,-1];

j=filter2(h,i);

6. 線性濾波

利用二維卷積conv2濾波, 如:

i=imread('e:\w01.tif');

h=[1,1,1;1,1,1;1,1,1];

h=h/9;

j=conv2(i,h);

7. 中值濾波

medfilt2函式用於影象的中值濾波,如:

i=imread('e:\w01.tif');

j=medfilt2(i);

8. 銳化

(1)利用Sobel運算元銳化影象, 如:

i=imread('e:\w01.tif');

h=[1,2,1;0,0,0;-1,-2,-1];%Sobel運算元

j=filter2(h,i);

(2)利用拉氏運算元銳化影象, 如:

i=imread('e:\w01.tif');

j=double(i);

h=[0,1,0;1,-4,0;0,1,0];%拉氏運算元

k=conv2(j,h,'same');

m=j-k;

六. 舉例

二維傅立葉變換和二維傅立葉反變換:

i=imread('e:\w01.tif');

figure(1);

imshow(i);

colorbar;

j=fft2(i);

k=fftshift(j);

figure(2);

l=log(abs(k));

imshow(l,[]);

colorbar

n=ifft2(j)/255;

figure(3);

imshow(n);

colorbar;

影象的變換

 

1. 離散傅立葉變換的 Matlab 實現

      Matlab 函式 fft、fft2 和 fftn 分別可以實現一維、二維和 N 維 DFT 演算法;而函式 ifft、ifft2 和 ifftn 則用來計算反 DFT 。這些函式的呼叫格式如下:

         A=fft(X,N,DIM)

      其中,X 表示輸入影象;N 表示取樣間隔點,如果 X 小於該數值,那麼 Matlab 將會對 X 進行零填充,否則將進行擷取,使之長度為 N ;DIM 表示要進行離散傅立葉變換。

        A=fft2(X,MROWS,NCOLS)

其中,MROWS 和 NCOLS 指定對 X 進行零填充後的 X 大小。

        A=fftn(X,SIZE)

其中,SIZE 是一個向量,它們每一個元素都將指定 X 相應維進行零填充後的長度。

      函式 ifft、ifft2 和 ifftn的呼叫格式於對應的離散傅立葉變換函式一致。

例子:影象的二維傅立葉頻譜

% 讀入原始影象

I=imread('lena.bmp');

imshow(I)

% 求離散傅立葉頻譜

J=fftshift(fft2(I));

figure;

imshow(log(abs(J)),[8,10])

2. 離散餘弦變換的 Matlab 實現

2.1. dct2 函式

功能:二維 DCT 變換

格式:B=dct2(A)

        B=dct2(A,m,n)

        B=dct2(A,[m,n])

說明:B=dct2(A) 計算 A 的 DCT 變換 B ,A 與 B 的大小相同;B=dct2(A,m,n) 和 B=dct2(A,[m,n]) 通過對 A 補 0 或剪裁,使 B 的大小為 m×n。

2.2. dict2 函式

功能:DCT 反變換

格式:B=idct2(A)

        B=idct2(A,m,n)

        B=idct2(A,[m,n])

說明:B=idct2(A) 計算 A 的 DCT 反變換 B ,A 與 B 的大小相同;B=idct2(A,m,n) 和 B=idct2(A,[m,n]) 通過對 A 補 0 或剪裁,使 B 的大小為 m×n。

2.3. dctmtx函式

功能:計算 DCT 變換矩陣

格式:D=dctmtx(n)

說明:D=dctmtx(n) 返回一個 n×n 的 DCT 變換矩陣,輸出矩陣 D 為 double 型別。

3. 影象小波變換的 Matlab 實現

3.1 一維小波變換的 Matlab 實現

(1) dwt 函式

功能:一維離散小波變換

格式:[cA,cD]=dwt(X,'wname')

        [cA,cD]=dwt(X,Lo_D,Hi_D)

說明:[cA,cD]=dwt(X,'wname') 使用指定的小波基函式 'wname' 對訊號 X 進行分解,cA、cD 分別為近似分量和細節分量;[cA,cD]=dwt(X,Lo_D,Hi_D) 使用指定的濾波器組 Lo_D、Hi_D 對訊號進行分解。

(2) idwt 函式

功能:一維離散小波反變換

格式:X=idwt(cA,cD,'wname')

        X=idwt(cA,cD,Lo_R,Hi_R)

        X=idwt(cA,cD,'wname',L)

        X=idwt(cA,cD,Lo_R,Hi_R,L)

說明:X=idwt(cA,cD,'wname') 由近似分量 cA 和細節分量 cD 經小波反變換重構原始訊號 X 。

        'wname' 為所選的小波函式

        X=idwt(cA,cD,Lo_R,Hi_R) 用指定的重構濾波器 Lo_R 和 Hi_R 經小波反變換重構原始訊號 X 。

        X=idwt(cA,cD,'wname',L) 和 X=idwt(cA,cD,Lo_R,Hi_R,L) 指定返回訊號 X 中心附近的 L 個點。

3.2 二維小波變換的 Matlab 實現

          二維小波變換的函式

-------------------------------------------------

     函式名                函式功能

---------------------------------------------------

     dwt2            二維離散小波變換

   wavedec2       二維訊號的多層小波分解

     idwt2           二維離散小波反變換

   waverec2        二維訊號的多層小波重構

   wrcoef2          由多層小波分解重構某一層的分解訊號

   upcoef2          由多層小波分解重構近似分量或細節分量

   detcoef2         提取二維訊號小波分解的細節分量

   appcoef2        提取二維訊號小波分解的近似分量

   upwlev2         二維小波分解的單層重構

   dwtpet2         二維週期小波變換

   idwtper2        二維週期小波反變換

-------------------------------------------------------------

(1) wcodemat 函式

功能:對資料矩陣進行偽彩色編碼

格式:Y=wcodemat(X,NB,OPT,ABSOL)

        Y=wcodemat(X,NB,OPT)

        Y=wcodemat(X,NB)

        Y=wcodemat(X)

說明:Y=wcodemat(X,NB,OPT,ABSOL) 返回資料矩陣 X 的編碼矩陣 Y ;NB 偽編碼的最大值,即編碼範圍為 0~NB,預設值 NB=16;

       OPT 指定了編碼的方式(預設值為 'mat'),即:

                 OPT='row' ,按行編碼

                 OPT='col' ,按列編碼

                 OPT='mat' ,按整個矩陣編碼

       ABSOL 是函式的控制引數(預設值為 '1'),即:

                 ABSOL=0 時,返回編碼矩陣

                 ABSOL=1 時,返回資料矩陣的絕對值 ABS(X)

(2) dwt2 函式

功能:二維離散小波變換

格式:[cA,cH,cV,cD]=dwt2(X,'wname')

        [cA,cH,cV,cD]=dwt2(X,Lo_D,Hi_D)

說明:[cA,cH,cV,cD]=dwt2(X,'wname')使用指定的小波基函式 'wname' 對二維訊號 X 進行二維離散小波變幻;cA,cH,cV,cD 分別為近似分量、水平細節分量、垂直細節分量和對角細節分量;[cA,cH,cV,cD]=dwt2(X,Lo_D,Hi_D) 使用指定的分解低通和高通濾波器 Lo_D 和 Hi_D 分解訊號 X 。

(3) wavedec2 函式

功能:二維訊號的多層小波分解

格式:[C,S]=wavedec2(X,N,'wname')

        [C,S]=wavedec2(X,N,Lo_D,Hi_D)

說明:[C,S]=wavedec2(X,N,'wname') 使用小波基函式 'wname' 對二維訊號 X 進行 N 層分解;[C,S]=wavedec2(X,N,Lo_D,Hi_D) 使用指定的分解低通和高通濾波器 Lo_D 和 Hi_D 分解訊號 X 。

(4) idwt2 函式

功能:二維離散小波反變換

格式:X=idwt2(cA,cH,cV,cD,'wname')

        X=idwt2(cA,cH,cV,cD,Lo_R,Hi_R)

        X=idwt2(cA,cH,cV,cD,'wname',S)

        X=idwt2(cA,cH,cV,cD,Lo_R,Hi_R,S)

說明:X=idwt2(cA,cH,cV,cD,'wname') 由訊號小波分解的近似訊號 cA 和細節訊號 cH、cH、cV、cD 經小波反變換重構原訊號 X ;X=idwt2(cA,cH,cV,cD,Lo_R,Hi_R) 使用指定的重構低通和高通濾波器 Lo_R 和 Hi_R 重構原訊號 X ;X=idwt2(cA,cH,cV,cD,'wname',S) 和 X=idwt2(cA,cH,cV,cD,Lo_R,Hi_R,S) 返回中心附近的 S 個數據點。

(5) waverec2 函式

說明:二維訊號的多層小波重構

格式:X=waverec2(C,S,'wname')

        X=waverec2(C,S,Lo_R,Hi_R)

說明:X=waverec2(C,S,'wname') 由多層二維小波分解的結果 C、S 重構原始訊號 X ,'wname' 為使用的小波基函式;X=waverec2(C,S,Lo_R,Hi_R) 使用重構低通和高通濾波器 Lo_R 和 Hi_R 重構原訊號。

影象處理工具箱

1. 影象和影象資料

   預設情況下,MATLAB將影象中的資料儲存為雙精度型別(double),64位浮點

數,所需儲存量很大;MATLAB還支援另一種型別無符號整型(uint8),即影象矩

陣中每個資料佔用1個位元組。

   在使用MATLAB工具箱時,一定要注意函式所要求的引數型別。另外,uint8

與double兩種型別資料的值域不同,程式設計需注意值域轉換。

          從uint8到double的轉換

   ---------------------------------------------

       影象型別        MATLAB語句

   ---------------------------------------------

     索引色             B=double(A)+1

     索引色或真彩色 B=double(A)/255

     二值影象          B=double(A)

   ---------------------------------------------

         從double到uint8的轉換

   ---------------------------------------------

       影象型別        MATLAB語句

   ---------------------------------------------

    索引色               B=uint8(round(A-1))

    索引色或真彩色    B=uint8(round(A*255))

    二值影象            B=logical(uint8(round(A)))

   ---------------------------------------------

2. 影象處理工具箱所支援的影象型別

2.1 真彩色影象

    R、G、B三個分量表示一個畫素的顏色。如果要讀取影象中(100,50)處的畫素值,

可檢視三元資料(100,50,1:3)。

    真彩色影象可用雙精度儲存,亮度值範圍是[0,1];比較符合習慣的儲存方法是用無

符號整型儲存,亮度值範圍[0,255]

  

2.2 索引色影象

   包含兩個結構,一個是調色盤,另一個是影象資料矩陣。調色盤是一個有3列和若干行

的色彩映象矩陣,矩陣每行代表一種顏色,3列分別代表紅、綠、藍色強度的雙精度數。

  

   注意:MATLAB中調色盤色彩強度[0,1],0代表最暗,1代表最亮。

          常用顏色的RGB值

   --------------------------------------------

    顏色    R   G   B      顏色    R   G   B

   --------------------------------------------

     黑     0   0   1      洋紅    1   0   1

     白     1   1   1      青藍    0   1   1

     紅     1   0   0      天藍 0.67 0   1

     綠     0   1   0      橘黃    1 0.5 0

     藍     0   0   1      深紅   0.5 0   0

     黃     1   1   0       灰    0.5 0.5 0.5      

   --------------------------------------------

         產生標準調色盤的函式

   -------------------------------------------------

    函式名       調色盤

   -------------------------------------------------

     Hsv       色彩飽和度,以紅色開始,並以紅色結束

     Hot       黑色-紅色-黃色-白色

     Cool      青藍和洋紅的色度

     Pink      粉紅的色度

     Gray      線型灰度

     Bone      帶藍色的灰度

     Jet        Hsv的一種變形,以藍色開始,以藍色結束

     Copper    線型銅色度

     Prim       三稜鏡,交替為紅、橘黃、黃、綠和天藍

     Flag       交替為紅、白、藍和黑

--------------------------------------------------

   預設情況下,呼叫上述函式灰產生一個64×3的調色盤,使用者也可指定調色盤大小。

  

   索引色影象資料也有double和uint8兩種型別。

   當影象資料為double型別時,值1代表調色盤中的第1行,值2代表第2行……

   如果影象資料為uint8型別,0代表調色盤的第一行,,值1代表第2行……

2.3 灰度影象

   儲存灰度影象只需要一個數據矩陣。

   資料型別可以是double,[0,1];也可以是uint8,[0,255]

2.4 二值影象

   二值影象只需一個數據矩陣,每個畫素只有兩個灰度值,可以採用uint8或double型別儲存。

   MATLAB工具箱中以二值影象作為返回結果的函式都使用uint8型別。

2.5 影象序列

   MATLAB工具箱支援將多幀影象連線成影象序列。

   影象序列是一個4維陣列,影象幀的序號在影象的長、寬、顏色深度之後構成第4維。

   分散的影象也可以合併成影象序列,前提是各影象尺寸必須相同,若是索引色影象,

調色盤也必須相同。

   可參考cat()函式    A=cat(4,A1,A2,A3,A4,A5)

3. MATLAB影象型別轉換

         影象型別轉換函式

   ---------------------------------------------------------------------------

     函式名                      函式功能

   ---------------------------------------------------------------------------

     dither       影象抖動,將灰度圖變成二值圖,或將真彩色影象抖動成索引色影象

    gray2ind    將灰度影象轉換成索引影象

    grayslice    通過設定閾值將灰度影象轉換成索引色影象

     im2bw      通過設定亮度閾值將真彩色、索引色、灰度圖轉換成二值圖

    ind2gray    將索引色影象轉換成灰度影象

    ind2rgb      將索引色影象轉換成真彩色影象

    mat2gray   將一個數據矩陣轉換成一副灰度圖

    rgb2gray    將一副真彩色影象轉換成灰度影象

    rgb2ind      將真彩色影象轉換成索引色影象

   ----------------------------------------------------------------------------

4. 影象檔案的讀寫和查詢

4.1 圖形影象檔案的讀取

   利用函式imread()可完成圖形影象檔案的讀取,語法:

     A=imread(filename,fmt)

     [X,map]=imread(filename,fmt)

     [...]=imread(filename)

     [...]=imread(filename,idx) (只對TIF格式的檔案)

     [...]=imread(filename,ref) (只對HDF格式的檔案)

   通常,讀取的大多數影象均為8bit,當這些影象載入到記憶體中時,Matlab就將其存放

在類uint8中。此為Matlab還支援16bit的PNG和TIF影象,當讀取這類檔案時,Matlab就將

其存貯在uint16中。

   注意:對於索引影象,即使影象陣列的本身為類uint8或類uint16,imread函式仍將

顏色映象表讀取並存貯到一個雙精度的浮點型別的陣列中。

4.2 圖形影象檔案的寫入

   使用imwrite函式,語法如下:

   imwrite(A,filename,fmt)

   imwrite(X,map,filename,fmt)

   imwrite(...,filename)

   imwrite(...,parameter,value)

   當利用imwrite函式儲存影象時,Matlab預設的方式是將其簡化道uint8的資料格式。

4.3 圖形影象檔案資訊的查詢   imfinfo()函式

5. 影象檔案的顯示

5.1 索引影象及其顯示

   方法一:

          image(X)

          colormap(map)

   方法二:

          imshow(X,map)

5.2 灰度影象及其顯示

   Matlab 7.0 中,要顯示一副灰度影象,可以呼叫函式 imshow 或 imagesc (即

imagescale,影象縮放函式)

   (1) imshow 函式顯示灰度影象

    使用 imshow(I)    或 使用明確指定的灰度級書目:imshow(I,32)

   

    由於Matlab自動對灰度影象進行標度以適合調色盤的範圍,因而可以使用自定義

大小的調色盤。其呼叫格式如下:

           imshow(I,[low,high])

    其中,low 和 high 分別為資料陣列的最小值和最大值。

   (2) imagesc 函式顯示灰度影象

   下面的程式碼是具有兩個輸入引數的 imagesc 函式顯示一副灰度影象

       imagesc(1,[0,1]);

       colormap(gray);

    imagesc 函式中的第二個引數確定灰度範圍。灰度範圍中的第一個值(通常是0),

對應於顏色映象表中的第一個值(顏色),第二個值(通常是1)則對應與顏色映象表

中的最後一個值(顏色)。灰度範圍中間的值則線型對應與顏色映象表中剩餘的值(顏色)。

    在呼叫 imagesc 函式時,若只使用一個引數,可以用任意灰度範圍顯示影象。在該

呼叫方式下,資料矩陣中的最小值對應於顏色映象表中的第一個顏色值,資料矩陣中的最大

值對應於顏色映象表中的最後一個顏色值。

5.3 RGB 影象及其顯示

   (1) image(RGB)

   不管RGB影象的型別是double浮點型,還是 uint8 或 uint16 無符號整數型,Matlab都

能通過 image 函式將其正確顯示出來。

   RGB8 = uint8(round(RGB64×255)); % 將 double 浮點型轉換為 uint8 無符號整型

   RGB64 = double(RGB8)/255;            % 將 uint8 無符號整型轉換為 double 浮點型

   RGB16 = uint16(round(RGB64×65535)); % 將 double 浮點型轉換為 uint16 無符號整型

   RGB64 = double(RGB16)/65535;      % 將 uint16 無符號整型轉換為 double 浮點型

   (2) imshow(RGB) 引數是一個 m×n×3 的陣列

5.4 二進位制影象及其顯示

   (1) imshow(BW)

   在 Matlab 7.0 中,二進位制影象是一個邏輯類,僅包括 0 和 1 兩個數值。畫素 0 顯示

為黑色,畫素 1 顯示為白色。

   顯示時,也可通過NOT(~)命令,對二進位制圖象進行取反,使數值 0 顯示為白色;1 顯示

為黑色。

   例如: imshow(~BW)

   (2) 此外,還可以使用一個調色盤顯示一副二進位制影象。如果圖形是 uint8 資料型別,

則數值 0 顯示為調色盤的第一個顏色,數值 1 顯示為第二個顏色。

   例如: imshow(BW,[1 0 0;0 0 1])  

5.5 直接從磁碟顯示影象

   可使用一下命令直接進行影象檔案的顯示:

        imshow filename

   其中,filename 為要顯示的影象檔案的檔名。

   如果影象是多幀的,那麼 imshow 將僅顯示第一幀。但需注意,在使用這種方式時,影象

資料沒有儲存在Matlab 7.0 工作平臺。如果希望將影象裝入工作臺中,需使用 getimage 函

數,從當前的控制代碼圖形影象物件中獲取影象資料,

   命令形式為: rgb = getimage;