0

グレースケールの 8 ビット符号なし整数の raw バイナリ ファイルである画像ファイルがあり、それを 16 ビット ファイルに変換して raw バイナリで保持する必要があります。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 ビット ストリームがリトル エンディアンかビッグ エンディアンかを制御できます。

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

ビッグエンディアンになります。

于 2012-06-07T22:11:02.763 に答える