如何基于数组显示图块

How to display tiles based on an array

我创建了一些非常基本的 perlin 噪声并像这样对其进行了简化。

from PIL import Image
col = Image.open("noise3.png")
grey = col.convert("L")
bw = grey.point(lambda x : 0 if x<128 else 255, "1")
bw.save("converted.png")

所以输出图像是:http://imgur.com/a/3WVrh

然后我将这张图片转换成这样的数组:

from PIL import Image
import numpy as np

im = Image.open("converted.png","r")
pix_val = list(im.getdata())

Map_Array = np.reshape(pix_val, (-1, 128))

它根据图像中的每个像素输出二维数组。

[255 255 255 ...,   0   0   0]
[  0   0 255 ...,   0   0   0]
[  0   0 255 ...,   0   0   0]
..., 
[255 255 255 ..., 255 255 255]
[255 255 255 ..., 255 255 255]
[255 255 255 ...,   0 255 255]

我如何从这个二维数组中将它们绘制到屏幕上,例如它说 255 可以显示一个蓝色矩形,如果它说 0 则显示一个红色矩形?显然稍后我希望分配纹理而不是颜色,但目前这并不重要。

PIL 图像到 Numpy 数组

首先,不要以这种方式将PIL Image转换为Numpy Array。它会破坏像素顺序。相反,使用

Map_Array = np.array(im)

由于 im 中只有两个值,Map_Array 将是一堆 TrueFalse。如果你真的想要它是 0255。这样做

Map_Array = np.array(im, dtype=np.uint8)    # Contains 0 and 1.
Map_Array[Map_Array==1] = 255

情节

简单地用pyplot

绘制
import matplotlib.pyplot as plt
plt.imshow(Map_Array)
plt.show()

由于默认颜色图,这两种颜色可能不是蓝色和红色。创建蓝色和红色的自定义颜色图,以您的颜色绘制图像。

from matplotlib.colors import LinearSegmentedColormap
cm = LinearSegmentedColormap.from_list('CustomMap', [(1, 0, 0),  (0, 0, 1)])    # Red and blue.
plt.imshow(Map_Array, cmap=cm)
plt.show()

有关自定义颜色图的详细信息,请参阅 here