Почему PIL и matplotlib создают здесь совершенно разные изображения? - PullRequest
0 голосов
/ 14 апреля 2019

Я создавал образ чего-либо из массива, и matplotlib может выдавать только «dpi» до того, как ядро ​​вылетает после того, как вы его спросите (например, для графика dpi = 8000, ядро ​​просто мгновенно умирает).Поэтому я решил сделать изображение с PIL - но оно было полностью испорчено.

Я создал MCVE:

a = np.zeros([5,5])
a[:,2] = 255
a = np.repeat(a[...,np.newaxis], 3, axis=2)

Если мы введем это через matplotlib с

img = plt.imshow(a)
plt.show()

Мы получаем это изображение: Extremely simple expected plot.

Но если мы используем аналогичный код PIL

img = Image.fromarray(a, "RGB")
img.save("Stuff.png")

, мы получаем это изображение:

Crazy image with weird colours.

(изображение здесь снято на экран и увеличено, поскольку в действительности оно составляет всего 5x5 пикселей)

Почемуэто?!Это просто ошибка?!

РЕДАКТИРОВАТЬ: Вопрос теперь решен, и благодаря этому и предыдущему вопросу мои вычисления гораздо быстрее и питоннее.В качестве благодарности SO вот скриншот 400-мегапиксельного изображения набора Мандельброта, окрашенного на основе квадранта C, в который попадает точка Z, точно так же, как она выходит, что теперь можно вычислить за 2 минуты:

enter image description here

1 Ответ

1 голос
/ 14 апреля 2019

Вы используете 64-битные значения с плавающей запятой в качестве входных данных, поскольку это dtype по умолчанию для np.zeros(). fromarray() Режим «RGB» требуется 3 x 8 битных пикселей.

Попробуйте с:

img = Image.fromarray(a.astype(np.uint8), "RGB")
...