0

ここで利用可能なVipsのドキュメントのいくつかを調べましたが、まだ答えが見つかりません.

PIL 画像がこのように自動的に処理されるのと同様に、画像を numpy 3D 配列に入れたいと思います。

In[1]:  import numpy
In[2]:  from PIL import Image
In[3]:  image = Image.open('43.jpg')
In[4]:  image
Out[4]: <PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=3216x2136 at 0x7F0C8D8B9950>
In[5]:  imgArray2 = numpy.asarray(image, dtype=numpy.float32)
In[6]:  imgArray2.shape
Out[6]: (2136, 3216, 3)

.

これは私がこれまでのところVipsのために持っているものです...

In[1]:  import numpy
In[2]:  from gi.repository import Vips
In[3]:  image = Vips.Image.new_from_file('43.jpg')
In[4]:  image
Out[4]: <Image object at 0x7f0c9a66c5f0 (VipsImage at 0x338a190)>
In[5]:  imgArray2 = numpy.asarray(image, dtype=numpy.float32)
Out[5]: ValueError: setting an array element with a sequence.

したがって、Vips Image オブジェクトから正しい形式でデータを取得していないため、最後にそのエラーが発生します。

4

2 に答える 2

2

.write_to_memory()とが必要です.new_from_memory()。C ドキュメントは次のとおりです。

http://www.vips.ecs.soton.ac.uk/supported/8.0/doc/html/libvips/VipsImage.html#vips-image-write-to-memory

http://www.vips.ecs.soton.ac.uk/supported/8.0/doc/html/libvips/VipsImage.html#vips-image-new-from-memory

Python では次のように使用します。

$ python
Python 2.7.9 (default, Apr  2 2015, 15:33:21)
[GCC 4.9.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from gi.repository import Vips
>>> x = Vips.Image.new_from_file("/home/john/pics/k2.jpg")
>>> y = x.write_to_memory()
>>> type(y)
<type 'str'>
>>> z = Vips.Image.new_from_memory(y, x.width, x.height, x.bands, Vips.BandFormat.UCHAR)
>>> x.avg()
102.79218031609196
>>> z.avg()
102.79218031609196

つまり、JPEG ファイルを文字列に送信し、文字列から新しい画像を再度作成します。文字列は、画像の値を構成する一連のバイトです。したがって、このような 8 ビット RGB 画像の場合、次で始まります。

R1 G1 B1

ここで、R1 は画像の左右のピクセルの赤チャンネルの値です。ピクセルは、上から下への一連のスキャンラインとして格納されます。

numpy には float ピクセルが必要ですか? を使用してフロート ピクセルを生成するように vip に依頼できますx.cast(Vips.BandFormat.FLOAT).write_to_memory()

于 2015-07-26T13:45:10.233 に答える