是否可以将三值数组转换为图像?

时间:2019-04-01 14:50:17

标签: python arrays numpy tkinter python-imaging-library

我正在尝试将随机填充数字(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 :(得分:0)

您可以使用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()

答案 1 :(得分:0)

因此,此过程分为两个部分,以及一些解决方法。

为简单起见,您可以简单地制作一个由三元组组成的二维numpy数组:

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

然后对其进行迭代,根据调用{返回的值,将每个值分配给(225,0,0),(0,255,0)或(0,0,255) 3}}。


不过,更笼统地说,如果您想要任意数量的颜色以及这些颜色的任意分配,我建议您选择类似的内容:

  1. 使用来自random library的随机值制作2D数组
  2. 将这些值缩放为任意颜色,然后转换为整数
  3. 为新的numpy数组中的每个像素着色,并使其颜色对应于其编号
  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()


响应编辑:

您可以像在该代码示例中一样进行一些小的更改,但是您需要使用numpy.random.rand中的其中一项,才能将函数应用于2D numpy数组中的每个值。

答案 2 :(得分:0)

也许是这样吗?

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]

答案 3 :(得分:0)

您与代码非常接近,只是缺少一个查找表(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