我有一个灰度8位无符号整数原始二进制文件的图像文件,我需要将其转换为16位文件并将其保存为原始二进制文件。从16到8相对容易,因为你只是在切断信息,但我很好奇我怎么能走另一条路。
具体来说,我有一个图像进入用C ++编写的处理器,处理器只需要16位无符号整数图像文件,所以我需要将我的8位文件转换为16位文件。我一直在使用Python Imaging Library进行一些处理,但是却找不到这个特定的功能。
更新:
我遵循了cgohlke的建议并使用以下代码看似合乎逻辑但由于以下错误而不接受我的'final'变量:
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)
答案 0 :(得分: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')
答案 1 :(得分:0)
struct模块可以让你进行那种转换,虽然你需要自己仔细阅读和写入文件,但是如果你把它存储在'data'中,这应该可行:
import struct
uint8 = 'B'
uint16 = 'H'
data = struct.pack(uint16 * len(data),
*struct.unpack(uint8 * len(data), data))
添加'&gt;'或'&lt;'将让你控制你的16位流是小端还是大端,即
data = struct.pack('>' + uint16 * len(data),
*struct.unpack(uint8 * len(data), data))
会让它成为大端。