2016-10-06 7 views
2

ピローとnumpyを使用してイメージの色を修正しようとしています。 n.s.arrayと組み合わせてim.split()を使用する。ピット/ numpyを使用して分割バンドのいずれかで.dotを実行した後、分割イメージをマージすることはできません

私は赤いバンドのすべての色を掛けたいですが、その方法を見つけることができません。

私は物事のすべての種類を試してみたとグーグルの多くは、これが解決策になることを期待していた後:

from PIL import Image 
import numpy as np 

im=Image.open('test.jpg') 
r,g,b=im.split() 

datar = np.array(r) 
datag = np.array(g) 
datab = np.array(b) 

rm=0.4 # the value I would like to multiply all red pixels by 

datar=datar.dot(rm) # this works, but turns the values in the array into floats 
datar=datar.astype(int) # I was hoping this would solve it 

im=Image.merge("RGB", (Image.fromarray(datar), Image.fromarray(datag), Image.fromarray(datab))) 

私は配列でたくさんのことを行うことができますし、マージが成功しますが、これは私に次のエラーを与えるしよう:

im=Image.merge("RGB", (Image.fromarray(datar), Image.fromarray(datag), Image.fromarray(datab))) 
    File "/usr/local/lib/python2.7/dist-packages/PIL/Image.py", line 2408, in merge 
im.putband(bands[i].im, i) 
ValueError: images do not match 

配列は.DOTと.astype(int型)の前後で同じに見える適用され、値が正しく掛けています。

答えて

2

Image.mergeは、rgbイメージが同じモードでないために失敗します(PIL Image modes参照)。この理由は、numpyの配列の型である

>>> Image.fromarray(datar).mode 
'I' 
>>> Image.fromarray(datag).mode 
'L' 

:あなたはモードをこのように確認することができます

>>> datar.dtype 
dtype('int32') 
>>> datag.dtype 
dtype('uint8') 

はこれを修正するには、これを置き換えます。これで

datar=datar.astype(int) 

datar = datar.astype('uint8') 
関連する問題