我有三个2D数据集,我试图用matplotlib
绘制成RGB图像。我以为这会很简单,但我发现这非常令人沮丧。
下面是我目前正在使用的代码:
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1.axes_rgb import RGBAxes
b = simg["B"].astype(bool).astype(int)
g = simg["G"].astype(bool).astype(int)
r = simg["R"].astype(bool).astype(int)
fig = plt.figure()
ax = RGBAxes(fig, [0.1, 0.1, 0.8, 0.8], pad=0.0)
ax.imshow_rgb(r, g, b, interpolation="none")
其中simg
是包含我的单通道图像的字典,存储为dtype = uint16
的(n, m)
数组。原始数据“几乎是二进制的”,所以我使用astype
来阈值化它。作为参考,每个通道在阈值化后包含大约5-10%的1。这是按预期工作的,所以我不认为这是问题所在。但我尝试删除astype
s无论如何,它没有解决这个问题。
下面是上面代码片段的结果:
在这个截图中,我已经放大了,我圈出的区域应该是一个绿色像素,这个数据出现在图像中,因为在这个像素上滚动鼠标显示它在tkinter窗口中确实有一个[0, 1, 0]
的值。
我想这可能与RGBAxes
有关,所以我尝试了一种简单得多的方法来显示此数据:
rgb = np.dstack((r, g, b))
plt.imshow(rgb, interpolation="none")
这将创建一个(n, m, 3)
数组,imshow
documentation将其解释为RGB图像,但这也只是绘制一个全黑的图像。我还尝试了所有可用的插值方法,并尝试更改绘制后端(当前为tkinter
,但我也尝试了Qt5
)。
如果我只绘制一个通道,则数据绘制良好。例如:
plt.imshow(b, cmap="binary_r", interpolation="none")
图像中的结果:
这正是我期望在那个通道中看到的。所以关于试图同时绘制三个通道的一些东西并不像我期望的那样起作用。
我非常感谢任何人在这里给予的任何指导,我也很乐意提供任何可能有帮助的附加信息。如果我不能让这个工作,我可能会尝试使用matplotlib.cm.ScalarMappable
推出我自己的解决方案,并手动组合RGB通道,但如果我走这条路,我还需要重新实现RGBAxes
的功能(即单独的,较小的R,G和B图旁边的组合RGB图像),这将是一种乏味。
1条答案
按热度按时间4jb9z9bj1#
我已经解决了这个问题,就像通常的情况一样,我确信不是问题的那部分事实上就是问题所在。
更仔细地查看
imshow
文档(链接在问题中)揭示了imshow
根据数据类型以两种不同的方式解释(n, m, 3)
数组。对于浮点数组,数据被假定在[0.0, 1.0]
范围内,但对于整数数组,数据被假定在[0, 255]
范围内。因此,本质上,它 * 是 * 正确绘制的,但因为我的数据是整数数据(使用astype
阈值化之前和之后),我基本上是在8位RGB中绘制尽可能接近黑色的颜色,而不是它们实际上是黑色。我的显示器不是很好,对我来说它们都与黑色没有区别。简单的解决方案是在阈值化之后将数据类型更改为float而不是int:
现在,这将产生预期的出色三通道RGB图像: