Я пытаюсь написать код, который создает образ фрактала Мандельброта в Python 3. Код работал без использования массивов с пустыми фрагментами, но медленно. Чтобы ускорить его, я попытался использовать numpy и numba.
При использовании Image.fromarray () в PIL для массива из 3 кортежей полученное изображение представляет собой серию вертикальных линий, а не ожидаемое изображение Мандельброта.
После некоторого исследования я думаю, что проблема связана с типами данных и, возможно, с целыми числами со знаком и без знака. Я могу заставить вещи работать, если я сохраню целые числа вместо 3 кортежей для значений HSV в массиве numpy. К сожалению, это дает черно-белое изображение, и я хочу красочное изображение.
Другая странная вещь заключается в том, что изображение, создаваемое кодом, слегка меняется при каждом его запуске. Я не уверен, является ли это связанным или отдельным вопросом.
Вот код, настроенный для удаления генератора Мандельброта и простого создания изображения градиента, который показывает проблему:
from PIL import Image, ImageDraw
from numba import jit
import numpy as np
@jit
def simple_image(width,height):
n3 = np.empty((width, height), dtype=object)
for i in range(width):
for j in range(height):
n3[i, j] = (min(j, 255), 255, 255)
return n3
arr = simple_image(800, 600)
im = Image.new('HSV', (800, 600), (0, 0, 0))
im = Image.fromarray(arr.astype(object), mode='HSV')
im.convert('RGB').save('output.png', 'PNG')
Вот изображение, которое генерируется. Вертикальные линии
Когда я делаю несколько изменений в коде, чтобы он сохранял целые и создавал черно-белое изображение, он работает:
from PIL import Image, ImageDraw
from numba import jit
import numpy as np
@jit
def simple_image(width,height):
n3 = np.empty((width, height))
for i in range(width):
for j in range(height):
n3[i, j] = min(j, 255)
return n3
arr = simple_image(800, 600)
im = Image.new('HSV', (800, 600), (0, 0, 0))
im = Image.fromarray(arr)
im.convert('RGB').save('output.png', 'PNG')