2012年9月29日 星期六

二進位與十進位

在影像處理上,常常需要將二元影像值經過特定的排列順序成為一個想像中的數值,再去做進一步的處理。理論上是容易想像,但實際寫程式卻很瑣碎。在MATLAB中,有一些好用的指令可以減少惱人的程式碼。

用一個簡單的例子來說:我們將二元影像值切成一個3X3的方塊,每個方塊看成一個長度為九的二進位數字,將此二進位以十進位表示。



以 MATLAB 的指令來達成以上的例子:
>> A = [1 0 1; 0 0 1; 1 0 0]

A =

     1     0     1
     0     0     1
     1     0     0

>> bin2dec(num2str(A(:)'))

ans =

   326

顯然答案與預期不符,主要的原因來自於A(:) = 101000110 並不是預期的 101001100。MATLAB 將二維轉換成一維是Y軸優先,也就是 A(:) = [A(1,1) A(2,1) A(3,1) A(2,1) A(2,2) A(3,2)  A(1,3) A(2,3) A(3)]; 所以先將A轉置,再化成一維陣列,也就是:



矩陣 A 為3x3,經由轉置成為矩陣B, B(:)轉為垂直的一維陣列,再經轉置成為水平的一維陣列。比較容易搞錯的是 bin2dec 輸入參數必須是個字串,所以先將長度為九的向量經由 num2str 轉為字串,再由 bin2dec 來處理。


沒有留言:

張貼留言