Converting Between Image Classes (matlab 中映像類之間的轉換)

來源:互聯網
上載者:User

標籤: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 中映像類之間的轉換)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.