Есть ли способ конвертировать массив из 3 значений в изображение? - PullRequest
2 голосов
/ 01 апреля 2019

Я пытаюсь преобразовать массив, заполненный случайным образом числами (0,1,2), в изображение, где каждое число показано другим цветом (желательно, если я выбрал его, если это возможно), но я не могу найти какой-либо способ сделать это. Есть кто-то, кто знает, можно ли это сделать?

Я пытался использовать PIL, но мои попытки оказались очень неудовлетворительными. Буду очень признателен, если кто-нибудь сможет помочь


Я понял, как показать это как изображение, но я не знаю, как это рандомизировать Допустим, у меня есть массив с размерами 400x500, и я хотел бы, чтобы каждая ячейка имела одно из трех значений, могу ли я сделать что-то подобное? (большая часть кода написана в комментарии, он написан не мной)

from PIL import Image 
import numpy as np 

w, h = 500, 400 
a = [255, 0, 0]
b = [0, 255, 0]
c = [0, 0, 255]
data = np.array(np.random.random((a,b,c),(h, w, 3), dtype=np.uint8) 
#I'd like the random.random to take one of the three values ("[255, 0, 0]", "[0,255, 0]", or "[0, 0, 255]") 
img = Image.fromarray(data, 'RGB') 

img.save('my.png') 
img.show() 

Есть ли способ сделать это?


Я понял, спасибо всем за помощь!

Ответы [ 4 ]

0 голосов
/ 03 апреля 2019

Вы были очень близки с вашим кодом, вы просто пропустили Таблица поиска (LUT), чтобы найти цвет, соответствующий вашим 0,1,2 данным:

#!/usr/local/bin/python3
import numpy as np
from PIL import Image

# Specify image size, create and fill with random 0, 1, or 2
w, h = 500, 400 
data = np.random.randint(0,3,(h, w), dtype=np.uint8)

# Make LUT (Look Up Table) with your 3 colours
LUT = np.zeros((3,3),dtype=np.uint8)
LUT[0]=[255,0,0]
LUT[1]=[0,255,0]
LUT[2]=[0,0,255]

# Look Up each pixel in the LUT
pixels = LUT[data]

# Convert Numpy array to image, save and display
img = Image.fromarray(pixels) 
img.save('result.png')
img.show() 

enter image description here

0 голосов
/ 01 апреля 2019

Итак, есть две-три части этого, и несколько способов сделать это.

Для простоты вы можете просто создать двумерный массив из троек:

np.zeros((h, w, 3))

И затем выполнить итерацию по нему, присваивая каждому значению либо (225, 0, 0), (0, 255, 0), либо (0, 0, 255) в зависимости от значения, возвращаемого при вызове случайная библиотека .


Более обобщенно, хотя, если вы хотите произвольное количество цветов и произвольное назначение этих цветов, я бы порекомендовал что-то более похожее на:

  1. Создание двумерного массива со случайными значениями из numpy.random.rand
  2. масштабируйте эти значения до любого количества цветов и конвертируйте в целые числа
  3. раскрасьте каждый пиксель в новом массиве с цветом, соответствующим его номеру
  4. конвертировать в изображение PIL
colorMapping = {
    0: (255, 0, 0),
    1: (0, 255, 0),
    2: (0, 0, 255),
    3: (255, 255, 0),
    4: (128, 42, 7),
    5: (128, 42, 7)
    # whatever colors you want. Could also use a list, but may be less clear.
}
w = #something
h = #something
numberOfColors = len(colorMapping)

randArray = np.random.rand(w, h)
scaledArray = randArray * numberOfColors
colorMapArray = scaledArray.astype(int)

# see [here][3] for sleeker, more elegant way of doing this
pixels = np.zeros((w, h, 3))
for i in range(0, w):
    for j in range(0, h):
        colorNumber = colorMapArray[i, j]
        pixels[(i, j)] = colorMapping[colorNumber]


im = Image.fromarray(pixels.astype('uint8'), 'RGB')
im.show()


В ответ на правку:

Вы можете сделать это, как в этом примере кода, с небольшими изменениями, но вам нужно использовать одну из вещей в , этот вопрос также связан выше , для применения функции к каждому значению в 2D массив numpy.

0 голосов
/ 01 апреля 2019

Может как то так?

import numpy as np

colors = [[255, 0, 0], [0, 255, 0], [0, 0, 255]]

# Make a mask for placing values
img = np.random.randint(0, num_colors, size=(256, 256))

color_img = np.zeros((img.shape[0], img.shape[1], 3), dtype='uint8')
color_img[img == 0, ...] = colors[0]
color_img[img == 1, ...] = colors[1]
color_img[img == 2, ...] = colors[2]
0 голосов
/ 01 апреля 2019

Вы можете использовать PIL для создания (и отображения) изображения:

from PIL import Image
import numpy as np

w, h = 512, 512
data = np.zeros((h, w, 3), dtype=np.uint8)
data[256, 256] = [255, 0, 0]
img = Image.fromarray(data, 'RGB')
img.save('my.png')
img.show()
...