将像素矩阵转换为图像 Python

4
我有关于像素的数据,格式如下(B,G,R)
M = [
  [(0, 0, 255), (0, 255, 0)],
  [(255, 0, 0), (0, 0, 0)]
]

这意味着这是一张二维图像,其中第一个像素是红色,第二个是绿色,第三个是蓝色,最后一个是黑色。显然我的原始图像非常大,所以2x2只是一个示例。基本上:
red, blue
green, black

我希望能将这些数据表现为一张图片:
from matplotlib import pyplot as plt
plt.imshow(np.array(M), interpolation='none')
plt.show()

但是这会给我一个完全空白(黑色)的屏幕。有没有一种简单的方法来获得一个漂亮的2x2像素图像?

3个回答

5
您不需要将图像转换为标准化的浮点数。您已经拥有正确的形状(MxNx3)和正确的范围(0-255),但它必须是np.uint8类型。来自文档

X:array_like,形状为(n,m)或(n,m,3)或(n,m,4)

将X中的图像显示到当前轴上。 X可以是float数组,uint8数组或PIL图像。如果X是数组,则可以具有以下形状:

MxN - 亮度(灰度,仅限于浮点数组)
MxNx3 - RGB(浮点或uint8数组)
MxNx4 - RGBA(浮点或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


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


2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接