繁体   English   中英

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

[英]Converting 2D Numpy array of grayscale values to a PIL image

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

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 位整数。 理论上,这应该通过 Image.fromarray 模式 L 处理成灰度图像 - 但结果是一组分散的白色像素。

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

如果您尝试制作渐变,您可以看到这一点。

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()

打造干净的渐变

对比

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( mat , 'L')
img.show()

有同样的神器。

如果我理解你的问题,你想使用 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()

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

要么

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

显然它接受类型 np.uint8(insert array here),为了简洁起见,也可以删除“L”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM