PIL, вероятно, не понимает, что ваши массивы представляют собой RGB-массивы, где они ожидают одноканальные (в градациях серого) массивы.
Это прекрасно работает (и быстрее благодаря использованию zip
для транспонирования данных массив).
def split_image_into_bands(filename):
basename = os.path.splitext(filename)[0]
img = Image.open(filename)
red, green, blue = zip(*img.getdata()) # each channel as a single-channel array
rimage = Image.new("L", img.size)
rimage.putdata(red)
gimage = Image.new("L", img.size)
gimage.putdata(green)
bimage = Image.new("L", img.size)
bimage.putdata(blue)
img = Image.merge(img.mode, (rimage, gimage, bimage))
img.save(basename + "_merged.jpg")