matplotlib imshow()使用3xN RGB数组

时间:2015-03-07 16:03:21

标签: python numpy

我使用值范围(0,1)的自定义3xN数据作为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-ticks看起来很有趣。我根本不理解Y轴上的-0.5刻度。为什么y轴的范围在[-0.5,2.5]?

之间

3 个答案:

答案 0 :(得分:3)

自己想出来:

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

    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 :(得分:2)

对于几年后登陆此页面的任何人,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

答案 2 :(得分:1)

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

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

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

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