0

我有一个图像文件,它是一个灰度 8 位无符号整数原始二进制文件,我需要将其转换为 16 位文件并将其保存为原始二进制文件。从 16 点到 8 点相对容易,因为您只是在切断信息,但我很好奇如何才能走另一条路。

具体来说,我有一个图像将进入用 C++ 编写的处理器,而处理器只需要 16 位无符号整数图像文件,所以我需要将我的 8 位文件转换为 16 位文件。我一直在使用 Python Imaging Library 进行一些处理,但找不到这个特定的函数。

更新

我遵循了 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)
4

2 回答 2

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')
于 2012-06-07T21:58:27.447 回答
0

struct 模块可以让你进行这种转换,虽然你需要自己处理文件的读取和写入,但如果你将它存储在“数据”中,这应该可以工作:

    import struct

    uint8 = 'B'
    uint16 = 'H'

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

添加 '>' 或 '<' 将让您控制您的 16 位流是 little-endian 还是 big-endian,即

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

将使其成为大端。

于 2012-06-07T22:11:02.763 回答