我有以下格式(B,G,R)的像素数据
M = [
[(0, 0, 255), (0, 255, 0)],
[(255, 0, 0), (0, 0, 0)]
]
这意味着这是一个2D图像,其中第一个像素是红色,第二个是绿色,第三个是蓝色,最后一个是黑色。显然我的原始图像非常大,所以2x2只是一个例子。基本上是:
red, blue
green, black
我想将此数据表示为图像:
from matplotlib import pyplot as plt
plt.imshow(np.array(M), interpolation='none')
plt.show()
但这给了我一个绝对空(黑色)的屏幕。是否有一种简单的方法可以获得漂亮的2x2像素图像?
答案 0 :(得分:4)
RGB数组的值必须代表所需的颜色;最简单的可能是将RGB值转换为[0,1]中的浮点数:(转换[0, 255] --> [0, 1]
)
import numpy
import matplotlib.pyplot as plt
randim_image1 = numpy.asarray([[(0., 0., 1.), (0., 1., 0.)], [(1., 0., 0.), (0., 0., 0.)]])
plt.imshow(image1, interpolation="none")
答案 1 :(得分:4)
您不一定要将图像转换为标准化浮点数。你有正确的形状(MxNx3)和正确的范围(0-255),但它必须是np.uint8
类型。来自documentation
X:array_like,shape(n,m)或(n,m,3)或(n,m,4)
将X中的图像显示到当前轴。 X可以是浮点数组,uint8数组或PIL图像。如果X是一个数组,它可以具有以下形状:
MxN - 亮度(仅灰度,浮点数)
MxNx3 - RGB(浮点数或uint8数组)
MxNx4 - RGBA(float或uint8数组)
但是,您的阵列数据是BGR格式,因此您需要反转第三维以使其为RGB格式。
image = np.array(M, dtype=np.uint8)[...,::-1]
引起我注意的另一个方面是你对数据的定义。列表列表首先表示行,因此M
实际上在第一行中为红色/绿色,在第二行中为蓝色/黑色。如果您想要按照您所说明的顺序排列像素,即红色/蓝色和绿色/黑色,则必须使用列转置行。
image_transp = np.transpose(image, (1, 0, 2))
现在,您可以绘制正确的图像表示形式(image
或image_transp
)。对于后者,你得到
plt.imshow(image_transp, interpolation='none')
答案 2 :(得分:1)
您定义了一个NxMx3阵列np.array(M).shape = (2, 2, 3)
,其中有四种颜色
(0, 0, 255)
(0, 255, 0)
(255, 0, 0)
和
(0, 0, 0)
The value for each component of MxNx3 float arrays should be in the range 0.0 to 1.0.