#python #arrays #python-2.7 #numpy #pillow
#python #массивы #python-2.7 #numpy #pillow
Вопрос:
Я пытаюсь исправить цвет на изображениях с помощью pillow и numpy. Использование im.split() в сочетании с np.array.
Я хотел бы умножить все цвета в красной полосе, но не могу найти способ сделать это.
Я перепробовал все виды вещей и после долгих поисков в Google надеялся, что это будет решением:
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), и значения умножаются правильно.
Ответ №1:
Image.merge
сбой, поскольку изображения rgb не имеют одинакового режима (см. Режимы изображения PIL). Вы можете проверить режим таким образом:
>>> 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')