MATLAB 程式設計入門篇影像顯示與讀寫張智星(jangmirlab.org)jangmirlab.orghttp:/mirlab.org/jang清大資工系 多媒體檢索實驗室MATLAB 程式設計入門篇:影像顯示與讀寫19-1 MATLAB的影像格式nMATLAB 最常處理的影像格式為索引影像(Indexed Images)n顯示此類型影像的語法如下:image(X)colormap(map)其中X為影像的資料矩陣,map為色盤矩陣n色盤矩陣的大小為K3,每個橫列由三個元素所組成,分別是R(紅)、G(綠)、B(藍),每個元素的範圍為01nX的值為1K,也就是當X(i,j)的值為p,則像素點(i,j)的顏色為map(p,:)這一列的向量所決定MATLAB 程式設計入門篇:影像顯示與讀寫索引影像:顯示n使用MATLAB顯示內建的小丑圖n範例19-1:image01.m load clown.mat%載入小丑影像資料,含變數 X 和 mapimage(X);%顯示影像colormap(map)%取用色盤矩陣 MATLAB 程式設計入門篇:影像顯示與讀寫索引影像:顯示n欲顯示對應的色盤,可再執行 colorbar,結果如下:MATLAB 程式設計入門篇:影像顯示與讀寫索引影像:驗證索引範圍n由於由X 是索引影像,因此其最小值是 1,最大值會等於 map 的列數(即可顯示之顏色數目),可驗証如下:n範例19-2:image02.mload clown.mat%載入小丑影像資料,含變數 X 和 mapfprintf(min(min(X)=%dn,min(min(X);fprintf(max(max(X)=%dn,max(max(X);fprintf(size(map,1)=%dn,size(map,1);MATLAB 程式設計入門篇:影像顯示與讀寫索引影像:驗證索引範圍min(min(X)=1max(max(X)=81size(map,1)=81 由範例可知,此小丑影像共含有 81 種不同的顏色。
MATLAB 程式設計入門篇:影像顯示與讀寫索引影像:驗證數值n索引影像的數值可以驗證如下n範例:indexedImage01.mload clown.mat%載入小丑影像資料,含變數 X 和 mapsubplot(2,2,1);image(X);axis imagesubplot(2,2,2);image(X(1:100,1:100);axis imagesubplot(2,2,3);image(X(1:3,1:3);axis imageX(1:3,1:3)subplot(2,2,4);image(69);axis imagecolorbarcolormap(map);MATLAB 程式設計入門篇:影像顯示與讀寫索引影像:驗證數值n結果:ans=2 2 2 61 69 69 69 61 69MATLAB 程式設計入門篇:影像顯示與讀寫索引影像:亂數色盤n要正確地顯示索引影像則需要正確的色盤,以上面的小丑影像為例,如果使用亂數產生的色盤則會產生下面的結果:n範例19-3:image03.mload clown.mat%載入小丑影像資料,含變數 X 和 mapnewmap=rand(size(map);image(X);colormap(newmap);colorbar;MATLAB 程式設計入門篇:影像顯示與讀寫索引影像:亂數色盤n由於色盤是亂數產生,所以每次結果都不一樣:MATLAB 程式設計入門篇:影像顯示與讀寫索引影像:強度影像n如果我們的色盤矩陣只有 K 個橫列,但是 X 的某些元素值小於 1 或大於 K,則我們可以使用imagesc指令將 X 的最小值轉換成 1,最大值轉成 K,其他中間值則依線性關係轉換成介於 1 與 K 的值,舉例如下:n範例19-4:imagesc01.m:X=peaks;imagesc(X);colormap(gray);colorbar;min(min(X)%顯示 X 的最小值max(max(X)%顯示 X 的最大值MATLAB 程式設計入門篇:影像顯示與讀寫索引影像:強度影像ans=-6.5466ans=8.0752n具有上述特性的影像資料稱為強度影像(Intensity Images),一般經由數值運算產生的矩陣均屬此類,因此均可由 imagesc 來顯示。
MATLAB 程式設計入門篇:影像顯示與讀寫全彩影像:顯示nimage 指令亦接受全彩影像(Truecolor Images)全彩影像可以表示成一個 mn3 的矩陣 X,其中 X(:,:,1)代表R(紅色)的強度X(:,:,2)代表G(綠色)的強度,X(:,:,3)則代表B(藍色)的強度nX的值的範圍可以是下列兩種:n介於01的浮點數n0255的uint8(詳見本章第三節)n範例19-5:image04.mX=imread(annie19980405.jpg);image(X);size(X)MATLAB 程式設計入門篇:影像顯示與讀寫全彩影像:顯示nans=n480 640 3n此時若再下達colorbar 指令,只會顯示內定的色盤,和圖形顯示沒有關係MATLAB 程式設計入門篇:影像顯示與讀寫19-2 影像的顯示與列印nMATLAB 在顯示影像時,會將之置於預設的圖軸之中,並以此圖軸的長寬比來成像,因而造成影像的失真若要以影像本身的長寬比來成像,可加入 axis image,如下:n範例19-6:image05.mload mandrill.mat image(X);colormap(map);axis imageMATLAB 程式設計入門篇:影像顯示與讀寫以原影像長寬比例顯示範例n亦可下達axis normal來觀看MATLAB的預設顯示結果。
MATLAB 程式設計入門篇:影像顯示與讀寫將影像對應到螢幕上的點的範例n若要使影像資料的每一點對應至螢幕上的一個像素(Pixel),可輸入如下:n範例19-7:image06.mload mandrill.matm,n=size(X);figure(unit,pixel,position,200,200,n,m);image(X);colormap(map);set(gca,position,0,0,1,1);MATLAB 程式設計入門篇:影像顯示與讀寫範例:將影像對應到螢幕上的點n此範例產生圖形如同前一個範例,如果你的螢幕解析度較低,圖形會變大n上述範例程式碼中,figure 的 position 性質為 200,200,n,m,代表視窗的左下角位置是 200,200(以 pixel 為單位),而視窗的寬度為 n,高度為 m,正好可以符合影像的大小ngca 傳回使用中的圖軸,最後一個敘述將圖軸的位置設為整個視窗的大小,使用了正規化的單位MATLAB 程式設計入門篇:影像顯示與讀寫影像的列印n在列印影像時,MATLAB 會根據視窗的 Paper position 性質來調整圖形的長寬比,使得印出的影像再度變形。
欲防止情況,可用下列指令:set(gcf,PaperPositionMode,auto)n若要使 Paper Position Mode 的預設值就是“auto”,可在 startup.m 檔案中加入下一行:set(0,DefaultFigurePaperPositionMode,auto)MATLAB 程式設計入門篇:影像顯示與讀寫19-3 8-bit影像n在 MATLAB 第 5 版之後,提供了 uint8 的資料型態n由於 uint8 只有 8 個位元,所以能表示的數值範圍為 0 至 255(=28-1)之間的整數MATLAB 程式設計入門篇:影像顯示與讀寫8-bit影像範例n由於 8-bit 影像資料的最小值為 0,和一般的雙精準索引影像資料相差 1,因此在兩種資料相互轉換時,要特別小心例如:n範例19-8:uint801.mload clown.matZ8=uint8(X-1);%將 X-1 轉成 uint8 的資料型態 close all%關掉所有的圖形視窗 image(Z8);colormap(map);colorbar;MATLAB 程式設計入門篇:影像顯示與讀寫8-bit影像範例MATLAB 程式設計入門篇:影像顯示與讀寫8-bit doublen若要將 8-bit 影像轉回雙精準影像,可輸入如下:Z64=double(Z8)+1;nuint8 資料型態亦可用於全彩影像資料,此時每一像素的原色(R,G 或 B)範圍為 0 至 255 間的整數,而不再是 0 至 1 的實數。
MATLAB 程式設計入門篇:影像顯示與讀寫8-bit doublen欲將雙精準的全彩影像轉作 uint8 資料型態,可輸入如下:RGB8=uint8(round(RGB64*255);n其中 RGB64 為雙精準的全彩影像資料,而 RGB8 則是 unit8 的 8-bit 影像資料反之,若欲進行反轉換,可輸入如下:RGB64=double(RGB8)/255;n關於影像類別及其資料型態的關係,可見下表:MATLAB 程式設計入門篇:影像顯示與讀寫影像類別及型態關係表資料型態影像類別雙精準(Double)uint8索引影像(Indexed Images)影像矩陣大小:mn影像矩陣大小:mn影像資料範圍:介於 1,k 的整數影像資料範圍:介於 0,k-1 的整數色盤矩陣大小:k3色盤矩陣大小:k3色盤資料範圍:介於 0,1 的實數色盤資料範圍:介於 0,1 的實數影像顯示指令:image影像顯示指令:image(註:k 的值不大於 256)強度影像(Intensity Images)影像矩陣大小:mn影像矩陣大小:mn影像資料範圍:任意實數(但通常是0,1)影像資料範圍:介於 0,255 的整數色盤矩陣大小:k3色盤矩陣大小:k3色盤資料範圍:介於 0,1 的實數色盤資料範圍:介於 0,1 的實數影像顯示指令:imagesc(色盤通常是灰階)影像顯示指令:imagesc(色盤通常是灰階)全彩影像(Truecolor Images)影像矩陣大小:mn3影像矩陣大小:mn3影像資料範圍:介於 0,1 的實數影像資料範圍:介於 0,255 的整數影像顯示指令:image影像顯示指令:imageMATLAB 程式設計入門篇:影像顯示與讀寫19-4 影像檔案的讀取與寫入 nimread 指令可用於讀取影像檔案。
nimwrite 則可用於寫入影像檔案n這兩個指令可以處理的影像格式有下列幾種:MATLAB 程式設計入門篇:影像顯示與讀寫imread及imwrite支援的格式影像檔案格式副檔名相關字串微軟視窗的 Bitmapbmpbmp階層式資料格式(Hierarchical Data Format)hdfhdfJoint Photographic Expert Groupjpg 或 jpegjpg 或 jpeg微軟視窗的 Paintbrushpcxpcx可攜式網路圖形(Portable Network Graphics)pngpng標記式影像檔案格式(Tagged Image File Format)tifftif 或 tiffX視窗傾印(X Windows Dump)xwdxwd圖形交換格式(Graphic Interchange Format)(第六版才支援)gifgifMATLAB 程式設計入門篇:影像顯示與讀寫imread 指令nimread 指令可以讀取上述格式的影像檔案,並進行必要之轉換,如下:n對於強度影像,imread 將資料以 uint8 的矩陣(大小為 mn)傳回n對於索引影像,imread 將資料以 uint8 的矩陣(大小為 mn)傳回,並同時傳回一個雙精準的色盤矩陣,其每個元素值介於0,1。
n對於全彩矩陣,imread 將資料以 uint8 的矩陣(大小為 mn3)傳回MATLAB 程式設計入門篇:影像顯示與讀寫使用imread讀取全彩jpeg影像nimread 可讀出下列全彩影像:n範例19-9:imread01.mRGB=imread(simulinkteam.jpg);image(RGB);axis image;class(RGB)MATLAB 程式設計入門篇:影像顯示與讀寫使用imread讀取索引影像nimread 可讀出下列索引影像:nimread02.mX,map=imread(sbtree.gif);image(X);colormap(map);colorbar;MATLAB 程式設計入門篇:影像顯示與讀寫影像檔案寫入範例nimwrite 指令可將資料寫成影像檔如下:n範例19-10:imwrite01.mn上述最後一列敘述將會呼叫 Windows 作業系統下的應用程式來開啟 myClown.jpg 檔案load clown.matimwrite(X,map,myClown.jpg);!start myClown.jpgMATLAB 程式設計入門篇:影像顯示與讀寫imfinfo指令nimfinfo 指令可傳回影像檔案的各項資訊,例如:ninfo1=imfinfo(simulinkteam.jpg)ninfo2=imfinfo(sbtree.gif)n對於不同的檔案格式,imfinfo 傳回的資訊項目可能有所不同。
MATLAB 程式設計入門篇:影像顯示與讀寫imfinfo執行結果ninfo1=imfinfo(simulinkteam.jpg)info1=Filename:simulinkteam.jpg FileModDate:28-三月-2000 17:30:36 FileSize:24071 Format:jpg FormatVersion:Width:234 Height:126 BitDepth:24 ColorType:truecolor FormatSignature:NumberOfSamples:3 CodingMethod:Huffman CodingProcess:Sequential Comment:1x70 charninfo2=imfinfo(sbtree.gif)info2=Filename:sbtree.gif FileModDate:10-九月-1997 14:53:14 FileSize:7121 Format:GIF FormatVersion:87a Width:99 Height:80 BitDepth:8 ColorType:indexed FormatSignature:GIF87a BackgroundColor:0 AspectRatio:0 ColorTable:256x3 double Interlaced:noMATLAB 程式設計入門篇:影像顯示與讀寫Quizn那些影像檔案格式支援全彩影像?哪一些支援索引影像?。