使用 pillow/numpy 在任何分割带上执行 .dot 后无法合并分割图像
A split image can't be merged after performing a .dot on any of the split bands using pillow/numpy
我正在尝试使用 pillow 和 numpy 校正图像中的颜色。结合使用 im.split() 和 np.array.
我想乘以红色带中的所有颜色,但找不到实现它的方法。
我尝试了各种方法,经过大量谷歌搜索后,我希望这就是解决方案:
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) 之前和之后看起来一样,并且值相乘正确。
Image.merge
失败,因为 rgb 图像的模式不同(参见 PIL Image modes)。您可以这样检查模式:
>>> Image.fromarray(datar).mode
'I'
>>> Image.fromarray(datag).mode
'L'
原因是numpy数组的类型:
>>> datar.dtype
dtype('int32')
>>> datag.dtype
dtype('uint8')
要解决这个问题,请替换为:
datar=datar.astype(int)
有了这个:
datar = datar.astype('uint8')
我正在尝试使用 pillow 和 numpy 校正图像中的颜色。结合使用 im.split() 和 np.array.
我想乘以红色带中的所有颜色,但找不到实现它的方法。
我尝试了各种方法,经过大量谷歌搜索后,我希望这就是解决方案:
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) 之前和之后看起来一样,并且值相乘正确。
Image.merge
失败,因为 rgb 图像的模式不同(参见 PIL Image modes)。您可以这样检查模式:
>>> Image.fromarray(datar).mode
'I'
>>> Image.fromarray(datag).mode
'L'
原因是numpy数组的类型:
>>> datar.dtype
dtype('int32')
>>> datag.dtype
dtype('uint8')
要解决这个问题,请替换为:
datar=datar.astype(int)
有了这个:
datar = datar.astype('uint8')