python - 用于图像的 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 数组转换为具有更多通道的图像?
解决方案
#!/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])
推荐阅读
- vba - 在某些情况下从网站下载数据的 VBA 代码
- c - -C中的Wimplicit-function声明
- typescript - Vue 中的 GraphQL 片段
- sql-server - 如何编写带有或错误的 IIF 语句?
- mysql - 引用时无法在mysql中创建表
- python - Pygame 鼠标悬停检测
- spring-boot - 控制执行 Mono 的重复任务的延迟
- python - 如何在单独的 Python 脚本中使用经过 Python 训练的模型
- r - 传单 setView 缩放级别到 R 中的非整数(十进制)值?
- java - 关闭之前的活动,除了其中一些在 Java 中