2

USB 遠地点カメラから読み取られる文字列があります。これは 12 ビット グレースケール イメージで、それぞれ 12 ビットが 16 ビット ワードの下位 12 ビットを占めています。最下位 4 ビットを無視して、この文字列から 8 ビットの png を作成したいと考えています。

PILを使用して、最上位4ビットが常にゼロである16ビット画像に変換できます

import Image

#imageStr is the image string
#imageSize is the image size 

img=Image.fromstring("I", imageSize, imageStr, "raw", "I;16", 0,1)
img.save("MyImage.png", "PNG")

とにかく、文字列を完全にアンパックして演算を行い、新しい文字列を作成することなく、8 ビット イメージを作成するために同様のことを行うことはできますか?

編集:画像の変換に関するWumpsのコメントは私にアイデアを与えてくれました。

img = img.point(lambda i: i * 16, "L") #shifts by 4 bits and converts to 8-bit image.

ありがとう

4

2 に答える 2

2

画像の変換についてのWumpのコメントは私にアイデアを与えました、そして私はそれをしました

#shifts by 4 bits and converts to 8-bit image
img = img.point(lambda i: i * 16, "L") 

ありがとうWump

于 2010-05-13T18:33:16.010 に答える
1

私がそれを行う方法を知っている唯一の方法は次のとおりです。

data = numpy.fromstring(imageStr, numpy.uint16)
data >>= 4 # shift out four bits
data = numpy.array(data, dtype=numpy.uint8)
img = Image.fromarray(data.reshape(imageSize))

原則として、PIL は次の方法で画像を変換できます。

img = img.convert("L")

しかし、問題は、精度を 8 ビット (AFAIK) に減らす方法がないため、すべてが 255 にクリップされることです:)

編集:中間文字列変換を削除しました。現在、numpy から PIL に直接移行しています。

于 2010-05-12T13:57:52.833 に答える