使用3xN RGB数组的matplotlib imshow()

2024-07-06 22:10:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用值范围(0,1)为RGB颜色的自定义3xN数据,并希望使用matplotlib.imshow()来显示它。

import pylab as plt
import numpy as np

Z = np.vstack([np.zeros((1, 256)), np.zeros((1, 256,)), np.zeros((1, 256,))])
im = plt.imshow(Z, interpolation='none', aspect='auto')
plt.colorbar(im, orientation='horizontal')
plt.show()

我希望这能给我一个黑色的形象。但我却得到了这样一个绿色的: enter image description here

而且Y形记号看起来很有趣。我根本不明白Y轴上的-0.5勾号。为什么y轴的范围在[-0.5,2.5]之间?


Tags: 数据importnumpymatplotlib颜色asnpzeros
3条回答

因为您基本上已经向np.imshow发送了一个无效图像。尝试打开计算机中的图像并进行比较。打开一个图像会给你一个(dimx, dimy, color_depth)形状,而你的Z(3, 256)形状。要确切地了解发生了什么,您可能应该查看imshow源代码,但我相当肯定它们有一些错误处理,从而产生您的结果。要创建一个图像,您可能应该

img = np.zeros((800, 500, 3), dtype=np.float32)

它会给你一个你想要的黑色方块。

此外,imshow还显示了一个坐标系,该坐标系左上角有一个(0,0,以匹配其他人传统上如何显示图像坐标系。

对于那些几年前登陆这个页面的人来说,OP找到了最初问题的原因,但是更简单的解决方法是:np.dstack()numpy.dstack

import numpy as np
import matplotlib.pyplot as plt

Z = np.vstack([np.zeros((1, 256)), np.zeros((1, 256,)), np.zeros((1, 256,))])
im = plt.imshow(np.dstack(Z), interpolation='none', aspect='auto')
plt.colorbar(im, orientation='horizontal')
plt.show()

result

我自己想出来了:

  1. imshow()期望输入数据数组大小为1 x N x 3。3表示RGB。
  2. 因为我的数据是3x N,imshow()认为它是三个数据,[-0.5,2.5]只是反映了三个垂直堆叠的数据行,每个数据行跨越0~1.0的范围。

下面是一个简单的解决方案:

import pylab as plt
import numpy as np

Z = np.vstack([np.zeros((1, 256)), np.zeros((1, 256,)), np.zeros((1, 256,))]).transpose()
Z = Z[None, ...]
im = plt.imshow(Z, interpolation='none', aspect='auto')
plt.colorbar(im, orientation='horizontal')
plt.show()

相关问题 更多 >