影象型別、MATLAB資料型別,以及型別之間的轉換(二)
上篇中我們根據需要將影象分為4種類型,其中每種影象的表示或多或少都牽扯到不同的資料型別,大致如下:
影象型別 | 使用到的資料型別 |
---|---|
灰度影象 | 畫素值為uint8,uint16,歸一化double等型別 |
二值影象 | 畫素值為logical型別 |
索引影象 | 畫素值以及MAP矩陣元素為uint8,uint16等型別 |
RGB影象 | 畫素值為uint8型別 |
其實無論是上邊哪種型別影象,之所以用到logical,uint8,uint16以及歸一化double等型別,很大的原因就在於這些影象的表示往往和具有這些資料型別的語言和工具有關係,比如MATLAB等。
MATLAB中的資料型別
MATLAB中的資料型別
在MATLAB中檢視MATLAB中常用的資料型別,可以輸入如下幫助語句:
help datatypes
通過上述語句可以檢視到MATLAB中常用的資料型別,在此我們根據需要僅僅列出和影象(特別是灰度影象)讀取、顯示和處理相關的一些常用資料型別,具體如下所示:
資料型別 | 作用及含義 |
---|---|
double | Convert to double precision. |
single | Convert to single precision. |
logical | Convert numeric values to logical. |
uint8 | Convert to unsigned 8-bit integer. |
uint16 | Convert to unsigned 16-bit integer. |
uint32 | Convert to unsigned 32-bit integer. |
uint64 | Convert to unsigned 64-bit integer. |
int8 | Convert to signed 8-bit integer. |
int16 | Convert to signed 16-bit integer. |
int32 | Convert to signed 32-bit integer. |
int64 | Convert to signed 64-bit integer. |
cell | Create cell array. |
struct | Create or convert to structure array. |
inline | Construct INLINE object. |
通過上表對MATLAB資料型別的概括,我們可以對MATLAB中的資料型別有一些整體感性認識,具體的說明如下:
資料型別 | 說明 |
---|---|
double | MATLAB的預設資料型別,分為普通的double型別和歸一化double型別 |
single | 單精度,較double型別只需要較少儲存空間,但精度和數值範圍不如前者 |
logical | 直譯過來為邏輯型別,即僅有0或1 |
integer | 最經常使用uint8型別,它是MATLAB中一種特殊的資料型別,可以達到儲存影象時節省儲存空間的作用1 |
如上所說,uint8型別可以達到節省儲存空間的作用,對於灰度影象來說,MATLAB在讀取該影象時,會儲存為uint8型別;然後MATLAB的預設型別又是double型別(因為該型別精度高,範圍大),所以資料型別之間存在轉換的可能和必要。再講這之前,我們還需要給double型別一些更多的注意力。
double型別的兩種數值範圍表示
特別需要說明的是,雖然double型別是MATLAB的預設型別,但是在不同的情況下,double型別存在兩種數值範圍。我們分別稱為普通的double型別和歸一化double型別,在一些情況下如果忽略該區別將會造成灰度影象顯示失敗等結果2。
double型別 | 數值範圍說明 |
---|---|
普通的double型別 | 佔用64bit,可顯示普通大小的所有數值 |
歸一化double型別 | 數值範圍為:0~1(一般0對應黑色,1對應白色) |
double型別與uint8型別之間的轉換
uint8型別轉換為double型別
轉換程式碼如下,其中A為uint8型別:
A =
0 100 200 255
>> B=double(A)
B =
0 100 200 255
由結果可知,轉換效果為:數值不變,返回double型別。
double型別轉換為uint8型別
轉換程式碼如下,其中C為普通double型別,E為歸一化double型別:
C =
-100 0 100 255 360
>> D=uint8(C)
D =
0 0 100 255 255
E =
0 0.3922 0.7843 1.0000
>> F=uint8(E)
F =
0 0 1 1
由結果可知,普通double型別轉換為uint8型別,發生截斷:小於0的轉換為0,大於255的轉換為255,其他四捨五入轉換為整數;歸一化double型別轉換為uint8型別,四捨五入為整數,輸出數值非0即1。
double型別和uint8型別的同類型轉換
無論是double型別轉換為double型別,還是uint8型別轉換為uint8型別,其輸出不發生任何變化。
總結
通過前邊的學習,我們對MATLAB中的資料型別以及常用的double型別和uint8型別的轉換有了一定的瞭解,掌握這些資料型別的區別和轉換,將有助我們有效地避免進行影象(特別是灰度影象)的讀取、顯示和處理時可能發生的細節性錯誤。
本篇對MATLAB資料型別及簡單轉換的說明到此為止,關於MATLAB中常用的型別轉換函式以及影象讀取顯示函式的內容,我將在下篇部落格中詳述,並給出必要的例項程式碼。