首页 > 解决方案 > 用于图像的 Numpy 数组和使用 PILlow 的通道数

问题描述

我想将 numpy 数组转换为图像并编写以下代码

import numpy as np
from PIL import Image

Channels = 5

x = np.random.choice([0,1] , (27,27,Channels), p=[1./3, 2./3])
x *= 255

PIL_im = Image.fromarray(np.uint8(x)) 

Channels如果取 2,3,4 作为值并且对于 1 或大于或等于 5 的值都不起作用,则它工作得很好。

我的代码有什么问题吗?是否无法将 numpy 数组转换为具有更多通道的图像?

标签: pythonarraysimagenumpypython-imaging-library

解决方案


#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Wed Feb  3 19:35:44 2021

@author: Pietro


"""

import numpy as np
from PIL import Image

Channels = 5
# Channels = 1

if Channels < 1:
    Channels = 1

if Channels > 1:
    x = np.random.choice([0,1] , (270,270,Channels), p=[1./3, 2./3])
    
else:
    x = np.random.choice([0,1] , (270,270), p=[1./3, 2./3])
    
# print(x)
print('x[0][0] : ',x[0][0])
print('x shape : ',x.shape)
print('x dim : ',x.ndim)
x *= 255
print('x[0][0] : ',x[0][0])
print('x shape : ',x.shape)
print('x dim : ',x.ndim)

if Channels > 1:
    x = x[:,:,0:4]
    
else:
    x = x


PIL_im = Image.fromarray(np.uint8(x))
    

print('PIL_im size : ', PIL_im.size)
print('PIL_im mode : ', PIL_im.mode)
PIL_im.show()

这适用于通道 1 和 >5

我认为它与枕头(PIL)如何读取您的阵列有关,如果它有超过 4 个通道(不确定这是正确的名称)它无法应对它。

3 个通道用于 RGB,4 个用于 RGBA,1 个单色,2 个带 alpha 的单色。看这里:

枕头文档概念

如果您使用:

x = np.random.choice([0,1] , (270,270,Channels), p=[1./3, 2./3]).astype(np.uint8)

PIL_im = Image.fromarray(x, mode='RGBA')

或者 :

PIL_im = Image.fromarray(np.uint8(x), mode='RGBA')

即使有超过 5 个通道,您也没有任何错误,并且不需要对数组进行切片:

if Channels > 1:
        x = x[:,:,0:4])

推荐阅读