如何根据数组显示切片

时间:2017-06-13 15:04:46

标签: arrays numpy mapping 2d noise

我已经创建了一些非常基本的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))

根据图像中的每个像素输出2D数组。

[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]

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

1 个答案:

答案 0 :(得分:0)

PIL图像到Numpy数组

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

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