在 Python 中绘制不规则间距的 RGB 图像
Posted
技术标签:
【中文标题】在 Python 中绘制不规则间距的 RGB 图像【英文标题】:Plotting an irregularly-spaced RGB image in Python 【发布时间】:2015-05-27 18:04:07 【问题描述】:我想用 matplotlib 在一组轴上绘制几个 RGB 图像。我最初尝试为此使用 imshow ,但它似乎无法处理一组具有不同范围的轴上的两个图像(当我绘制第二个时,它使第一个消失)。我认为这里的答案是使用 pcolormesh,比如How to plot an irregular spaced RGB image using python and basemap?
但是,这似乎对我不起作用 - 来自可映射的颜色(即我传递给 pcolormesh 的数据数组和我指定的 cmap)覆盖我指定的面颜色。网格的边缘确实有正确的颜色,但不是面。
有人知道如何直接设置面的颜色吗?理想情况下,我会使用一个 pcolormesh,它采用 n*m*3 数组作为 n*m 的替代品,就像 imshow...
我希望它如何工作的最小示例: 将 numpy 导入为 np 将 matplotlib.pyplot 导入为 plt
#make some sample data
x, y = np.meshgrid(np.linspace(0,255,1),np.linspace(0,255,1))
r, g = np.meshgrid(np.linspace(0,255,100),np.linspace(0,255,120))
b=255-r
#this is now an RGB array, 100x100x3 that I want to display
rgb = np.array([r,g,b]).T
m = plt.pcolormesh(x, y, rgb/255.0, linewidth=0)
plt.show()
问题是对 plt.pcolormesh 的调用失败了,
numRows, numCols = C.shape
ValueError: too many values to unpack
我猜这是因为它需要一个 2D 数组,而不是最后一个维度为 3 长的 3D 数组。
【问题讨论】:
这就是 pcolor 网格应该如何工作的......您能否提供一个您尝试过的最小(可运行)示例? @tcaswell 谢谢。这是我尝试的第一件事(我在上面添加了一个示例)但它不起作用,错误强烈表明它假设一个二维数组作为输入。如果它有所作为,我正在使用 matplotlib 1.3.1。 【参考方案1】:解决方案非常简单:我需要做的一件事不在我所链接的问题中,那就是从网格对象中删除数组。一个最小的例子,以防它对其他人有帮助:
import numpy as np
import matplotlib.pyplot as plt
#make some sample data
r, g = np.meshgrid(np.linspace(0,255,100),np.linspace(0,255,100))
b=255-r
#this is now an RGB array, 100x100x3 that I want to display
rgb = np.array([r,g,b]).T
color_tuple = rgb.transpose((1,0,2)).reshape((rgb.shape[0]*rgb.shape[1],rgb.shape[2]))/255.0
m = plt.pcolormesh(r, color=color_tuple, linewidth=0)
m.set_array(None)
plt.show()
我猜 color_tuple 行可能并不明显:本质上我们需要将 (n, m, 3) 数组转换为 (n*m, 3) 数组。我认为转置对于使所有内容正确匹配是必要的。还值得注意的是,我们传入的颜色需要是浮点数,介于 0 和 1 之间。
【讨论】:
你能在 gh 上添加一个关于这个的问题吗? 在此处发布:github.com/matplotlib/matplotlib/issues/4277,以便其他人可以看到何时不再需要此解决方法。 这似乎只在传递r
时有效,而不是r, g
... 所以我们只使用r
的形状而不是它的实际值了吗?
这个方法几乎解决了我的问题。 color_tuple 没有按正确的顺序排列颜色。我的图像看起来乱七八糟。
这个问题:***.com/questions/41389335/… 表明您需要用少一列来索引 RGB 数组,以使数组正确:rgb[:, :-1, :]。这样做会导致我的图像不会被打乱。【参考方案2】:
如何将所有图像组合成一个大的 numpy 数组,然后用 imshow 显示?
【讨论】:
这当然是一种选择,但我图像中的像素不一定匹配(例如,它们相对于彼此旋转)。当然,我可以根据需要旋转/缩放/重新采样它们,但这感觉就像我正在重新实现 pcolormesh 为我免费提供的单色图像的许多功能。不过,我相当确定重新采样/合并自己然后使用 imshow 会更快。以上是关于在 Python 中绘制不规则间距的 RGB 图像的主要内容,如果未能解决你的问题,请参考以下文章