首页 文章

Python:如何从numpy数组中编写单通道png文件?

提问于
浏览
-1

我想从python中的numpy数组写一个单通道png图像?在Matlab中即可

A = randi(100,100,255)
imwrite(uint8(A),'myFilename.png','png');

我看过使用 from PIL import ImageImage.fromarray() 的示例,但它们仅用于jpeg和3通道png ...

我已经使用opencv找到了解决方案,我将在此处发布 . 希望它会缩短别人的搜索...

3 回答

  • 2

    PIL的 Image.fromarray() 自动确定mode使用传递的numpy数组的from the datatype,例如您可以使用的8位灰度图像:

    from PIL import Image
    import numpy as np
    
    data = np.random.randint(256, size=(100, 100), dtype=np.uint8)
    img = Image.fromarray(data)  # uses mode='L'
    

    但是这只适用于您的数组使用兼容的数据类型,如果您只是使用 data = np.random.randint(256, size=(100, 100)) ,这可能会导致一个int64数组(typestr <i8 ),PIL无法处理 .

    您还可以指定其他模式,例如将32位数组解释为RGB图像:

    data = np.random.randint(2**32, size=(100, 100), dtype=np.uint32)
    img = Image.fromarray(data, mode='RGB')
    

    在内部Image.fromarray()只是尝试猜测正确的模式和大小,然后调用 Image.frombuffer() .

    然后可以将图像保存为任何格式 PIL can handle例如:img.save('filename.png')

  • 1

    这是一个使用opencv / cv2的解决方案

    import cv2
    myImg = np.random.randint(255, size=(200, 400)) # create a random image
    cv2.imwrite('myImage.png',myImg)
    
  • 2

    您可能不希望将OpenCV用于简单的图像处理 . 如建议的那样,使用PIL:

    im = Image.fromarray(arr)
    im.save("output.png", "PNG")
    

    你试过这个吗?什么在这里失败,导致你得出结论,这只是JPEG?

相关问题