将像素矩阵转换为图像python

时间:2016-04-06 05:34:12

标签: python numpy matplotlib scipy

我有以下格式(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像素图像?

3 个答案:

答案 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")

enter image description here

答案 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))

现在,您可以绘制正确的图像表示形式(imageimage_transp)。对于后者,你得到

plt.imshow(image_transp, interpolation='none')

enter image description here

答案 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.