Python 3 PIL: преобразование массива из 3-х кортежей Numpy в изображение в HSV - PullRequest
0 голосов
/ 11 марта 2019

Я пытаюсь написать код, который создает образ фрактала Мандельброта в 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')

1 Ответ

1 голос
/ 11 марта 2019

Вот код, который отвечает на вопрос благодаря предложению от hpaulj . Массив numpy был изменен с 2-мерного массива из 3-х кортежей на 3-ий массив с третьим измерением длины 3. dtype был установлен в 'uint8' в двух местах.

from PIL import Image, ImageDraw
from numba import jit
import numpy as np 

@jit
def white_image(width,height):
    n3 = np.empty((width, height, 3), dtype='uint8')
    for i in range(width):
        for j in range(height):
            n3[i, j, 0] = min(j, 255)
            n3[i, j, 1] = 255
            n3[i, j, 2] = 255
    return n3 

arr = white_image(800, 600) 

im = Image.new('HSV', (800, 600), (0, 0, 0))
im = Image.fromarray(arr.astype('uint8'), mode='HSV')
im.convert('RGB').save('output.png', 'PNG')
...