2014-05-05 14 views
3

我正在處理來自串行設備的數據,它以非常有趣的格式輸出其數據。該器件具有一個256x256像素陣列,而每個像素都具有一個值,可通過移位寄存器讀出。將十六進制值的行轉換爲二進制,垂直列

要顯示的格式,我將舉例說明,因爲它會看,如果每個像素有一個6位值:

 
          'Pixel #' 
     0-8 9-16 17-24 25-32 33-40 41-48 48-56 57-64 ... 256 
     -------------------------------------------------------------- 
    0 255 255 255 255 255 255 255 255 ... 
    1 127 255 255 255 255 255 255 255 ... 
    2 255 255 255 255 255 255 255 255 ... 
    3 255 255 255 255 255 255 255 255 ... 
    4 255 255 255 255 255 255 255 255 ... 
    5 255 255 255 255 255 255 255 255 ... 

    Note that the 2nd row starts with a value of 127 

要獲得1像素的6位值(像素#0),必須出現以下情況:

  1. 行的每個值需要被作爲它的二進制/位等效
  2. 垂直讀處理時,對齊位從每一行,6行向下(對於6比特輸出值),結果在該象素

的值即:

 
          'Pixel #' 
      0-8  9-16  17-24 25-32 ... 256 
     -------------------------------------------------------------- 
    0 *1*1111111 11111111 11111111 11111111 ... 
    1 *0*1111111 11111111 11111111 11111111 ... 
    2 *1*1111111 11111111 11111111 11111111 ... 
    3 *1*1111111 11111111 11111111 11111111 ... 
    4 *1*1111111 11111111 11111111 11111111 ... 
    5 *1*1111111 11111111 11111111 11111111 ... 

    Note that the 2nd row had a value of 127, which is 01111111 in binary 
    --> Pixel 0 = 101111 = 47 

現在,重複在所有256列,然後向下移動到下6行並重復。

實際輸出需要是256x256像素值的數組。我需要處理的實際數據集是每個像素14位 - 它是3584x32(14位* 256像素= 3584行...和32字節* 8位/字節= 32字節)。

什麼是處理數據集的最佳方法?另外,速度是至關重要的,那麼是否有一些高速功能可以被利用?

感謝幫助 - 謝謝!


編輯:

回答有關所需的速度問題 - 在理想情況下,我想執行此至少10倍/秒,因爲數據是在60倍/秒到來英寸因此,我認爲我需要避免常見的「連接」和字符串操作,因爲我認爲這些操作非常緩慢。

再次,真實數據集(3584x32)每個像素有14位,所以它是3584x32。

這裏是我工作的功能,採用Joran的方法,該方法〜2.6秒時,與真實的數據集提供給執行:

def GetFrame(RawData): 
    if np.shape(RawData) == (3584, 32): 
     ProcessedData = np.zeros((256, 256), dtype='int16') 
     data_blocks = [RawData[d:d+14] for d in range(0, 3584, 14)] 
     for p in range(256): 
      data_bin_rows = ["".join(map(lambda val:"{0:08b}".format(val,), row)) for row in data_blocks[p]] 
      ProcessedData[p][:] = [int("".join(v),2) for v in zip(*data_bin_rows)] 
     return ProcessedData 
    else: 
     return False 

那怎麼可以做出更快的得到執行時間下來?謝謝!

+1

你幾乎肯定會由I /在這種情況下限制○設備,數字轉換不是很複雜 –

回答

1

我不得不讀了幾次,但我認爲伊夫得到它

data = \ 
"""255 255 255 255 255 255 255 255 
127 255 255 255 255 255 255 255 
255 255 255 255 255 255 255 255 
255 255 255 255 255 255 255 255 
255 255 255 255 255 255 255 255 
255 255 255 255 255 255 255 255""" 

data_rows = [map(int,row.split()) for row in data.splitlines()] 
data_bin_rows = ["".join(map(lambda val:"{0:08b}".format(val,),row)) for row in data_rows] 
pixel_values = zip(*data_bin_rows) 
print pixel_values[0],"=",int("".join(pixel_values[0]),2) #pixel0 

着它的速度說話......但它可能是合理的,如果你不這樣做就像第二個一百萬次..應該比任何情況下的串行讀取快得多...

1

使用numpy的應該足夠快,或者你需要將它與彙編寫:

import numpy 
input_array = numpy.zeros((32,14,256), dtype="B") 
output_array = numpy.zeros((32,8,256), dtype='int16') 
for j in range(8): 
    bits = (input_array[:,:,:]>>j) & 1 
    for i in range(14): 
     output_array[:,j,:]|= bits[:,i,:] << i 
+0

numpy很棒......但很難說出新手(有時對我來說也是如此)+1,不過因爲這可能比我的解決方案明顯更快 –

+0

這怎麼能適應在我提供的代碼中使用我的新編輯?我無法弄清楚如何使用我的'input_array'的numpy.zeros((14,32),dtype =「B」)爲我的一行像素 – Chemik

相關問題