2012-06-07 91 views
0

我有一個圖像文件是一個灰度8位無符號整數原始二進制文件,我需要將其轉換爲16位文件,並保持它原始二進制。從16點到8點相對比較容易,因爲你只是關掉信息,但我很好奇我怎樣才能走向另一條路。將原始二進制8位無符號文件轉換爲16位無符號的Python成像庫

具體來說,我有一個圖像進入用C++編寫的處理器,處理器只需要16位無符號整數圖像文件,所以我需要將我的8位文件轉換爲16位文件。我一直在用Python Imaging Library做一些處理,但一直沒有找到這個特定的功能。

UPDATE

我也跟着cgohlke的建議,有下面的代碼,這似乎合乎邏輯,但它不接受,因爲下面的錯誤我的「最終」變量:

Traceback (most recent call last): 
    File "C:\Users\Patrick\workspace\colorCorrect\src\editGrayscale.py", line 36, in <module> 
    u1 = np.fromfile(final, 'uint8') 
TypeError: file() argument 1 must be encoded string without NULL bytes, not str 

我的代碼:

import Image 
import numpy as np 

fileName = raw_input("Enter a file name: ") 
saveFile = raw_input("Enter a new save file name: ") 

with open(fileName, 'rb') as f: 
    im = Image.fromstring('L', (3032, 2016), f.read()) # also try 'L;16B', 'I;16', and 'I;16B' 
    changed = im.point(lambda i: i/.4)  

final = changed.tostring() 

np.arange(256).astype('uint8').tofile(final) 

u1 = np.fromfile(final, 'uint8') 
u2 = u1.astype('uint16') 
u2 *= 257 # scale to full 16 bit range 
u2.tofile(saveFile) 

回答

1
import numpy as np 

# create example file 
np.arange(256).astype('uint8').tofile('uint8_file.bin') 

# read example file and convert to uint16 
u1 = np.fromfile('uint8_file.bin', 'uint8') 
u2 = u1.astype('uint16') 
u2 *= 257 # scale to full 16 bit range 
u2.tofile('uint16_file.bin') 
+0

當我把它放在它給我:「TypeError:file()參數1必須是編碼字符串沒有NULL字節,而不是str」 – clifgray

0

的STR UCT模塊將讓你做這種轉換的,儘管可能需要承擔自己的閱讀和寫入文件照顧,但如果您把它保存在「數據」,這應該工作:

import struct 

    uint8 = 'B' 
    uint16 = 'H' 

    data = struct.pack(uint16 * len(data), 
         *struct.unpack(uint8 * len(data), data)) 

添加「>」或「<」將讓你控制你的16位流是否是小端還是大端,即

data = struct.pack('>' + uint16 * len(data), 
         *struct.unpack(uint8 * len(data), data)) 

將使大端。

相關問題