将2D Numpy灰度值数组转换为PIL图像

时间:2016-06-01 02:38:34

标签: python numpy python-imaging-library

假设我在0到1的范围内有一个2D Numpy值数组,它代表一个灰度图像。然后我如何将其转换为PIL图像对象?到目前为止,所有尝试都产生了极其奇怪的散乱像素或黑色图像。

for x in range(image.shape[0]):
    for y in range(image.shape[1]):
        image[y][x] = numpy.uint8(255 * (image[x][y] - min) / (max - min))

#Create a PIL image.
img = Image.fromarray(image, 'L')

在上面的代码中,numpy数组图像通过(image [x] [y] - min)/(max - min)归一化,因此每个值都在0到1的范围内。然后它乘以255并且强制转换为8位整数。理论上,这应该通过带有模式L的Image.fromarray处理成灰度图像 - 但结果是一组分散的白色像素。

3 个答案:

答案 0 :(得分:7)

我认为答案是对的。 Image.fromarray(____,' L')函数似乎只适用于0到255之间的整数数组。我使用np.uint8函数。

如果你尝试制作渐变,你可以看到这个。

'

制作干净的渐变

VS

import numpy as np
from PIL import Image

# gradient between 0 and 1 for 256*256
array = np.linspace(0,1,256*256)

# reshape to 2d
mat = np.reshape(array,(256,256))

# Creates PIL image
img = Image.fromarray(np.uint8(mat * 255) , 'L')
img.show()

有同样的伪影。

答案 1 :(得分:2)

如果我理解你的问题,你想要使用PIL获得灰度图像。

如果是这种情况,则无需将每个像素乘以255.

以下为我工作

import numpy as np
from PIL import Image

# Creates a random image 100*100 pixels
mat = np.random.random((100,100))

# Creates PIL image
img = Image.fromarray(mat, 'L')
img.show()

答案 2 :(得分:0)

im = Image.fromarray(np.uint8(mat), 'L')

im = Image.fromarray(np.uint8(mat))

显然它接受类型 np.uint8(在此处插入数组),为了简洁起见,也可以删除“L”。