Объедините 3 отдельных массива numpy с RGB-изображением в Python
Итак, у меня есть набор данных, которые я могу преобразовать, чтобы сформировать отдельные массивы numpy в диапазонах R, G, B. Теперь мне нужно объединить их, чтобы сформировать изображение RGB.
Я попробовал "Изображение" для выполнения задания, но для этого требуется "режим".
Я попытался сделать трюк. Я бы использовал Image.fromarray(), чтобы передать массив в изображение, но по умолчанию он достигает режима "F", когда Image.merge требует, чтобы изображения режима "L" сливались. Если бы я объявлял атрибут массива в fromarray() на "L" на первом месте, все изображения R G B искажались.
Но, если я сохраняю изображения, а затем открываю их, а затем объединяюсь, он отлично работает. Изображение читает изображение с режимом "L" .
Теперь у меня есть две проблемы.
Во-первых, я не думаю, что это элегантный способ сделать работу. Поэтому, если кто-то знает лучший способ сделать это, скажите
Во-вторых, Image.SAVE работает неправильно. Ниже приведены ошибки, с которыми я сталкиваюсь:
In [7]: Image.SAVE(imagefile, 'JPEG')
----------------------------------------------------------------------------------
TypeError Traceback (most recent call last)
/media/New Volume/Documents/My own works/ISAC/SAMPLES/<ipython console> in <module>()
TypeError: 'dict' object is not callable
Просьба предложить решения.
И помните, что изображение размером около 4000x4000.
Ответы
Ответ 1
Я не очень понимаю ваш вопрос, но вот пример того, что я сделал недавно, похоже, что это может помочь:
# r, g, and b are 512x512 float arrays with values >= 0 and < 1.
from PIL import Image
import numpy as np
rgbArray = np.zeros((512,512,3), 'uint8')
rgbArray[..., 0] = r*256
rgbArray[..., 1] = g*256
rgbArray[..., 2] = b*256
img = Image.fromarray(rgbArray)
img.save('myimg.jpeg')
Я надеюсь, что это поможет
Ответ 2
rgb = np.dstack((r,g,b)) # stacks 3 h x w arrays -> h x w x 3
Также конвертировать поплавки 0.. 1 в uint8 s,
rgb_uint8 = (np.dstack((r,g,b)) * 255.999) .astype(np.uint8) # right, Janna, not 256
Ответ 3
Преобразуйте массивы numpy в uint8
, прежде чем передавать их в Image.fromarray
Eg. если вы плаваете в диапазоне [0..1]:
r = Image.fromarray(numpy.uint8(r_array*255.999))
Ответ 4
Ваше искажение, которое я считаю, вызвано тем, как вы разбиваете свое исходное изображение на отдельные группы, а затем снова изменяете его размер, прежде чем вставлять его в слияние;
`
image=Image.open("your image")
print(image.size) #size is inverted i.e columns first rows second eg: 500,250
#convert to array
li_r=list(image.getdata(band=0))
arr_r=np.array(li_r,dtype="uint8")
li_g=list(image.getdata(band=1))
arr_g=np.array(li_g,dtype="uint8")
li_b=list(image.getdata(band=2))
arr_b=np.array(li_b,dtype="uint8")
# reshape
reshaper=arr_r.reshape(250,500) #size flipped so it reshapes correctly
reshapeb=arr_b.reshape(250,500)
reshapeg=arr_g.reshape(250,500)
imr=Image.fromarray(reshaper,mode=None) # mode I
imb=Image.fromarray(reshapeb,mode=None)
img=Image.fromarray(reshapeg,mode=None)
#merge
merged=Image.merge("RGB",(imr,img,imb))
merged.show()
`
это хорошо работает!