Проблема в том, что PIL.Image.fromarray
ожидает, что его аргумент будет массивом целочисленных значений, но Numpy по умолчанию создает массивы значений с плавающей запятой. Таким образом, ваш массив color_world
содержит значения с плавающей точкой, и поэтому ваше изображение искажено. Вертикальная полоса возникает из-за сходства в двоичном представлении этих значений с плавающей запятой.
Чтобы исправить, используйте метод astype
массива Numpy, чтобы аргумент Image.fromarray
был массивом uint8
потому что это подходящий размер для ваших компонентов R, G и B. Вместо:
im = Image.fromarray(color_world, "RGB")
do:
im = Image.fromarray(color_world.astype("uint8"), "RGB")
В качестве альтернативы, создайте color_world
как массив uint8
с самого начала. Для этого измените:
color_world = np.zeros(arr.shape+(3,))
на:
color_world = np.zeros(arr.shape+(3,), dtype="uint8")
Это может быть немного более эффективно.