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

4
我使用自定义的3xN数据,值范围为(0,1)作为RGB颜色,并希望使用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]之间?
3个回答

3

我自己解决了:

  1. imshow() 函数期望输入的数据数组大小为 1 x N x 3,其中 3 表示 RGB。
  2. 因为我的数据是 3 x 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()

抱歉,我们可能同时开始编辑了!无论如何,谢谢你!+1 给你! - kakyo

3

如果有人几年后看到这个页面,原帖的问题已经被解决,但更简单的解决方法是: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


感谢您提供更好的解决方案。这应该成为新的被接受的答案。 - kakyo

1
因为您基本上向np.imshow发送了一个无效的图像。尝试打开计算机中的图像并进行比较。打开图像将给您一个(dimx,dimy,color_depth)形状,而您的Z(3, 256)形状。要确切地了解发生了什么,您应该检查imshow源代码,但我相当确定他们有一些错误处理会产生您的结果。要创建图像,您应该执行以下操作
img = np.zeros((800, 500, 3), dtype=np.float32)

这将会给你一个像你想要的一样的黑色正方形。

此外,imshow显示一个坐标系,其左上角有(0,0),以与传统图像坐标系统的显示方式相匹配。


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