Встроенный zip
делает именно то, что вы хотите. Если вы хотите использовать те же самые итерации вместо списков, вы можете посмотреть на itertools.izip, который делает то же самое, но дает результаты по одному.
Я не понимаю ваш вопрос, но вот пример чего-то подобного, который я сделал недавно, похоже, что он может помочь:
# 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')
Надеюсь, что это поможет
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
Преобразуйте массивы numpy в uint8
, прежде чем передавать их в Image.fromarray
Например. если вы плаваете в диапазоне [0..1]:
r = Image.fromarray(numpy.uint8(r_array*255.999))
Ваше искажение, которое, как я полагаю, вызвано тем, как вы разбиваете свое исходное изображение на отдельные группы и затем снова изменяете его размер, прежде чем вставлять его в слияние;
`
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()
`
это хорошо работает!