[轉]- matlab中圖像數據類型轉換


Matlab中的圖像數據類型轉換 
MATLAB中讀入圖像的數據類型是uint8,而在矩陣中使用的數據類型是double因此 I2=im2double(I1) :把圖像數組I1轉換成double精度類型;如果不轉換,在對uint8進行加減時會產生溢出,可能提示的錯誤為:Function '*' is not defined for values of class 'uint8'。

 

圖像數據類型轉換函數

默認情況下,matlab將圖像中的數據存儲為double型,即64位浮點數;matlab還支持無符號整型(uint8和uint16);uint型的優勢在於節省空間,涉及運算時要轉換成double型。
    im2double():將圖像數組轉換成double精度類型
     im2uint8():將圖像數組轉換成unit8類型 

     im2uint16():將圖像數組轉換成unit16類型

 

但是:對double型圖像用im2uint8(),會出現問題。double默認為0-1之間的數,uint8為0-255之間的數,如果數組uint8型x1={0,1,2},轉化后為x2={0,0.5,1}; 如果數組double型y1={0,1,2},轉化后為y2={0,255,255};

在用matlab工具箱做直方圖處理時,圖像必須為整型,即如果是double型,必須轉化為整型

解決辦法:

 

 

圖像處理工具箱
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;

 

 

bwlabel 
功能: 
標注二進制圖像中已連接的部分。 
L = bwlabel(BW,n) 
[L,num] = bwlabel(BW,n)

isbw 
功能: 
判斷是否為二進制圖像。 
語法: 
flag = isbw(A) 
相關命令: 
isind, isgray, isrgb 
74.isgray 
功能: 
判斷是否為灰度圖像。 
語法: 
flag = isgray(A) 
相關命令: 
isbw, isind, isrgb

11.bwselect 
功能: 
在二進制圖像中選擇對象。 
語法: 
BW2 = bwselect(BW1,c,r,n) 
BW2 = bwselect(BW1,n) 
[BW2,idx] = bwselect(...) 
舉例 
BW1 = imread('text.tif'); 
c = [16 90 144]; 
r = [85 197 247]; 
BW2 = bwselect(BW1,c,r,4); 
imshow(BW1) 
figure, imshow(BW2)

47.im2bw 
功能: 
轉換圖像為二進制圖像。 
語法: 
BW = im2bw(I,level) 
BW = im2bw(X,map,level) 
BW = im2bw(RGB,level) 
舉例 
load trees 
BW = im2bw(X,map,0.4); 
imshow(X,map)

Matlab中如何讀出寫入圖像文件以及對圖像的簡單處理

MATLAB圖像處理工具箱支持四種基本圖像類型:索引圖像、灰度圖像、二進制圖像和RGB圖像。MATLAB直接從圖像文件中讀取的圖像為RGB 圖像。它存儲在三維數組中。這個三維數組有三個面,依次對應於紅(Red)、綠(Green)、藍(Blue)三種顏色,而面中的數據則分別是這三種顏色 的強度值,面中的元素對應於圖像中的像素點。設所得矩陣為X三維矩陣(256,256,3) ,X(:,:,1)代表紅顏色的2維矩陣 X(:,:,2)代表綠顏色的2維矩陣, X(:,:,3)代表蘭顏色的2維矩陣。[X, map]=imread('34.bmp');r=double(X(:,:,1)); %r是256 x 256的紅色信息矩陣g=double(X(:,:,2)); %g是256 x 256的綠色信息矩陣b=double(X(:,:,3)); %b是256 x 256的蘭色信息矩陣
索引圖像數據包括圖像矩陣X與顏色圖數組map,其中顏色圖map是按圖像中顏色值進行排序后的數組。對於每個像素,圖像矩陣X包含一個值,這個值就是顏 色圖數組map中的索引。顏色圖map為m×3雙精度矩陣,各行分別指定紅、綠、藍(R、G、B)單色值,map=[RGB],R、G、B為值域為 [0,1]的實數值,m為索引圖像包含的像素個數。

對於相同的數據,采用uint8格式比雙精度格式節省內存空間,從而更經濟。在MATLAB中
如果索引圖像的顏色圖小於256行,則它的圖像矩陣以uint8格式存儲,否則以雙精度格式存儲。
一:imread:從圖像文件夾中讀取圖像。
A = imread(FILENAME,FMT) 讀取圖像到A,如果文件是包含一灰度圖像,A是一二維矩陣,如果文件是包含一真彩色圖像(RGB),A是一三維矩陣(M-by-N-by-3)。FILENAME :圖像文件名;FMT:圖像文件格式;
文件必須在當前目錄下,或在Matlab的一路徑上。如果 imread不能夠找到一名稱為FILENAME的文件,那么它將找一名為FILENAME.FMT的文件
[X,MAP] = imread(FILENAME,FMT) 把圖像FILENAME讀入與它相關的圖像色彩信息寫入MAP,圖像色彩信息值在范圍[0,1]中自動地重新調整. 
[...] = imread(FILENAME)這種方式是試圖得到文件的格式從文件所包含的信息。 
    [...] = imread(URL,...)從一Internet URL上讀圖像   URL 必須包含協議(即: "http://").
1.2數據類型:
    TIFF的特殊語法:
    [...] = imread(...,IDX) 從很多圖像TIFF文件中 讀一個圖像;IDX是一個整數值,它顯示了所讀圖像在文件中的順序,例如:如果 IDX是 3, imread將讀文件中的第三個圖像。 如果省略了這個變量, imread將讀文件中的第一個圖像. 
     IMREAD支持的圖像文件格式:JPEG TIFF GIF   BMP PNG HDF   PCX    XWD    ICO    CUR    RAS PBM   PGM   PPM 
相關信息也可在Matlab中查看: imfinfo, imwrite, imformats, fread,
二:imwrite輸出圖像
imwrite(A,FILENAME,FMT) 把圖像 A 寫入圖像文件 FILENAME.
imwrite(X,MAP,FILENAME,FMT) 把 X和它的相關色彩信息MAP寫入FILENAME. 
imwrite(...,FILENAME) 把圖像 寫入圖像文件FILENAME,並推測可能的格式用來做filename的擴展名。擴展名必須是FMT中一合法名.
imwrite(...,PARAM1,VAL1,PARAM2,VAL2,...) 不同的參數控制輸出文件的各種不同特征。參數要是當前所支持的HDF,JPEG, TIFF, PNG, PBM, PGM, 和PPM 文件
三:image 顯示圖像.image(C) 把矩陣 C 轉成一圖像. C 可以是一MxN 或 MxNx3維的矩陣,且可以是包含 double, uint8,或 uint16 數據.image是用來顯示附標圖像,即顯示的圖像上有x,y坐標軸的顯示,可以看到圖像的像素大小。但可以加上axis off命令即可把坐標去掉。
imshow只是顯示圖像。用colormap來定義圖像顯示用的顏色查找表,比如用colormap(pink),可以把黑白圖像顯示成帶粉紅色的圖像。
圖像像素矩陣的數據類型:(1)顯示真彩色圖像像素三維矩陣X,如果是uint8類型,要求矩陣的數據范圍為0-255,(2)如果是double型,則其數據范圍為0-1,要不就會出錯或者出現空白頁。
類型轉換:(1)如果你原來的數值是uint8,在運算中轉換為double后,實際要顯示的數值沒有改變的話,只要 用uint8(X)就可轉換為uint8型,如果不想轉換頻繁,也可在顯示時用X/255來轉換為符合0-1double類型范圍要求的數值顯示。(2) 如果顯示索引圖像(二維矩陣),如果索引圖像像素數值是double型,則它的取值范圍為1-length(colormap),數值起點為1,則矩陣中 數值為1的對應colormap中第一行數據,如果索引圖像像素數值是uint8,則取值范圍為0-255,數值起點為0,則矩陣中數值為0的對應 colormap中第一行數據,所以索引圖像這兩個數據類型之間的轉換,要考慮到+1或-1。直接用uint8或double轉換則會查找移位,產生失真 情況。uint16數據類型與uint8類似,取值范圍為0-65536。
四:其它常用圖像操作:
圖像顯示於屏幕有imshow( ), image( )函數;
圖像進行裁剪imcrop( );
圖像的插值縮放imresize( )函數實現;
旋轉用 imrotate( )實現。

 

轉自 http://blog.csdn.net/wd0225/article/details/7571133


免責聲明!

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



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