標籤:io 使用 ar for 資料 sp cti log on
首先類似於C中的類型轉換,matlab中也有其對應的類型轉換。
For example,
a=2;double(a) ---> 2.0 or 更多位元
a=2.1;uint8(a) ---> 2,反正是去掉了小數部分。
因為uint8是八個bit即一個byte儲存的,因此其範圍是0~255,超出255的double資料被強制轉換為255,低於0的double資料被強制轉換為0,中間的double資料則直接被去除小數部分。
a=[0,1;2,0];logical(a) ---> a=[0,1;1,0],非0全部轉換為1
a=[0,1;2.0,0];logical(a) ---> 同上
實際上,上述的還未轉換前的a均是double型,因為matlab預設將矩陣以double類型儲存。。。
but,
a=uint8([0,1;2,0]);logical(a) ---> a=[0,1;1,0],非0全部轉換為1
因此,logical的規則比較簡單。
下面,我們來看看image processing toolbox 提供的類型轉換函式的區別
有一些前提預設的東東:無法考證到出處。。。
--- > 映像的標準資料格式中,logical的取值範圍是{0,1},double的取值範圍是[0,1],uint8的取值範圍是[0,255]
下面給出函數執行個體:
f=[-0.5,0.5;0.75,1.5];
(1). g1=im2uint8(f) --> g1=[0,128;191,255]
--- > 低於0的被直接轉換為0,高於1的直接被轉換為1.注意原有的f裡面的最大值是f_max=1.5,最小值f_min=-0.5.
那麼f中的範圍介於0,1之間的值(設為f_value),被轉化為 (f_value - f_min)/(f_max-f_min);
可以看出這是一個比例轉換。。。
全部轉換為在[0,1]的比例後,再集體乘上255
(2).有的時候f中可能存在多個小於0或者多個超過1的數,如果再使用im2uint8 就會丟失比例資訊,十分噁心。
為了看起來不那麼噁心,matlab puts forward a function named mat2gray.
As the name suggests,matrix data(always double) converting to gray(notation for density of image,0~255之類的)...
but,,,mat2gray的輸出結果矩陣的範圍是[0,1].
ex. f=[-2.0,-0.5;0.5,2.0];mat2gray(f) ---> [0,0.3750;0.6250,1.0]
這裡先找到f_min 和 f_max,然後按照 (f_value - f_min)/(f_max - f_min) 對f中的每個資料(原始為f_value)進行轉換。。。
經此一役,得到的矩陣依舊是double型,此時再使用 im2uint8,就可以將矩陣以最初的比例映射到[0,255]範圍了。。。多麼簡單的映射阿,愚蠢的我思量了好久。。。
(3).簡單的邏輯轉換:
f=[-0.5,0.5;0.75,1.5];
g1=mat2gray(f); ---> g1=[0,0.5;0.625,1]
gb1=im2bw(g1,0.6); --> gb1=[0,0;1,1],大於0.6即輸出1,反之輸出0.。。。且結果矩陣是logical類型
gb2=g1 > 0.6 ---> 同上。。。。同樣是布爾值的奧義。。。
(4).轉換為 double型。。。
gb3=im2double(gb1); ---> gb3=[0,0;1,1]...只是gb3的class是double。。
gb4=im2double(uint8(gb1)); ---> gb4=[0,0;0.0039,0.0039];....
坑阿。。。logical到double直接就轉換過去,uint8到double就得把uint8的資料統一除以255。。。
簡單地想想,因為映像資料格式中,double是[0,1]間的。。因此得轉換為比例。。。
(5).漏了一個。。。im2uint8(f),即第一種情況,當f是logical類型時,if f_value 為1,則轉換為255,為0則轉換為0.。。
容易理解,二值映像主要是映像分割操作的結果,,,且以非黑(像素值0)即白(像素值255)的形式顯示出來以證明邊緣等的存在。。。
總之,uint8是標準的真彩範圍,double是[0,1]間,顯示了比例,logical主要用於二值映像~~~~~~~~~~~
親測,inshow這個函數,imshow(f)...預設會將對f進行 im2uint8操作。。。估計是為了顯示真彩吧。。。
注意這些坑爹的玩意吧。。。然後學渣用的ubuntu為了裝個matlab 2012 不得不刪除了很多歌曲,只是為了騰地方~~~~~~~~~~~~~~~~~
若有新坑,繼續補充~~~
Converting Between Image Classes (matlab 中映像類之間的轉換)