2017-11-24 18 views
0

scipyの文書によると、画像の1つのチャンネルを保存することができます。そのような画像の画像の2チャンネルの画像をpng形式で保存する

>>> x = np.zeros((255, 255)) 
>>> x = np.zeros((255, 255), dtype=np.uint8) 
>>> x[:] = np.arange(255) 
>>> imsave('/tmp/gradient.png', x) 

そして、3チャンネル:

>>> rgb = np.zeros((255, 255, 3), dtype=np.uint8) 
>>> rgb[..., 0] = np.arange(255) 
>>> rgb[..., 1] = 55 
>>> rgb[..., 2] = 1 - np.arange(255) 
>>> imsave('/tmp/rgb_gradient.png', rgb) 

しかし、PNGなどの画像の2つのチャネルだけを保存することは可能でしょうか?私は唯一の2チャンネルで上記のコードを模倣しようとしましたが、私は次のエラーで迎えています:

ValueError: 'arr' does not have a suitable array shape for any mode. 

答えて

1

それはあなたが達成したり保存したいチャンネルの種類をしたいのか私には完全には明らかではありません。

the PNG color options table hereによれば、グレースケール+アルファチャンネルを使用するオプションは1つだけです。もちろん、あなたが、そのようしかしあなたのデータを保存することができます

  • をこれは、16または32のビット深度を意味します。 、しかしは、2をサポートしていませんto thisのlibtiffに従ってそうでないかもしれないあなたが
  • ライブラリは、デフォルトで

TIFFがはるかに実際に柔軟で、かつarbritraryチャネルをサポートするようだグレースケール+アルファチャンネルとしてそれを解釈する欲しいものチャンネル。 (時代遅れの情報かもしれない、わからない)。

これはおそらく実際に何をしたいのかによって異なります。 2つのチャンネルを保存したいだけなので(あなたがバイトを保存し、より多くのチャンネルを必要としないので)、あなたのパイプラインのすべてのステップを好きなように解釈することができますが、空です(すべてゼロなど)。 PNGフィルタは効率的に圧縮することができます。もちろん、後で読む/使用するときは、コードを変更して保存時と同じように解釈する必要があります。

これは単にpythonのscientific-stackのみを使用するタスクの場合、numpyのsavez_compressedを使用して配列を保存することができます。 (注:汎用の圧縮がありますが、フィルタ用途はありませんが、x+1 - x - > pixels:0,1,2,3圧縮は難しいですが、delta-filterを使用します:0,1,1,1は簡単に圧縮できます

+0

赤と緑のチャンネルのみを保存したいだけです。青いチャンネルには興味がありません。そのチャンネルの情報がないからです。 – motiur

1

PNGファイル形式は、16ビットまたは32ビット(チャネルごと)のビット深度を持つ2つのチャネルの画像をサポートしています。 PNGはそのようなファイルをアルファ(すなわち透明度)チャネルを有するグレースケール画像として解釈する。実際、アルファチャンネルのグレースケール画像を作成しようとしている場合、この答えが役に立ちます。配列を格納するためにPNG形式を使用しようとしている場合は、別の形式を使用することをお勧めします。 @ saschaの提案の回答を参照してください。

私が書いたnumpngw modulesource code on github)は、この形式でPNGファイルを書き込むことができます。形状np.uint16またはnp.uint32の配列を、(m, n, 2)の形で渡してください。例えば

import numpy as np 
from numpngw import write_png 


# Create `img` with a black outer border, a white inner border and 
# a transparent square in the middle. 
img = np.full((64, 64, 2), fill_value=2**16-1, dtype=np.uint16) 
img[16:-16, 16:-16, 1] = 0 
img[:8, :, 0] = 0 
img[-8:, :, 0] = 0 
img[:, :8, 0] = 0 
img[:, -8:, 0] = 0 

write_png('foo.png', img) 

あなたは同じ形状とデータ型の配列に戻し、このデータを読み取るためにビットを実験する必要があるかもしれません。たとえば、このファイルを読むときの枕のデフォルト動作は、shape(m、n、4)の8ビット配列を返すことです。つまり、ピローはデータをRGBA形式に変換します。

関連する問題