Разделенное изображение не может быть объединено после выполнения .dot на любом из разделенных диапазонов с использованием pillow / numpy

#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')