【发布时间】:2011-06-29 16:30:11
【问题描述】:
我有一个巨大的 numpy ndarray,形状 (M x N x 3) 和数据类型 float32。我希望图像简单地显示在附有wx.ScrolledWindow 的wx.Frame 中。我想要 100% 缩放的图像,并且不会发生数据丢失是非常重要的。这些是需要保留为浮点值的超高分辨率 X 射线图像。
到目前为止,wx.Image 功能失败了,因为它们只接受 8 位整数的 ndarray。不好。
PIL 映像库也只能处理 8 位,还不够。
到目前为止,我发现唯一足够的库是 matplotlib,但我无法让 matplotlib 以我想要的方式显示。这让我很接近:
class View(wx.Frame):
def __init__(self):
wx.Frame.__init__(self,
parent=None,
title="DICOM Viewer",
size=(1280, 750),
pos=(0,0))
self.scroll = wx.ScrolledWindow(self, -1)
self.figure = plt.Figure()
self.canvas = FigureCanvasWxAgg(self.scroll, -1, self.figure)
self.axes = Axes(self.figure, [0,1,0,1])
self.figure.figimage(ndarray)
self.sizer.Add(self.canvas, 1, wx.EXPAND)
self.scroll.SetSizer(self.sizer)
figimage 函数只会显示原始像素,这是我想要的,但它只填充 wxFrame 的可视区域并且超级慢。可能是我的 wx 小部件有问题?
更好的解决方案是这样使用 imshow:
class View(wx.Frame):
def __init__(self):
wx.Frame.__init__(self,
parent=None,
title="DICOM Viewer",
size=(1280, 750),
pos=(0,0))
self.scroll = wx.ScrolledWindow(self, -1)
self.figure = plt.Figure()
self.canvas = FigureCanvasWxAgg(self.scroll, -1, self.figure)
self.axes = Axes(self.figure, [0,1,0,1])
self.axes = self.figure.add_subplot(111)
self.axes.imshow(ndarray)
self.sizer.Add(self.canvas, 1, wx.EXPAND)
self.scroll.SetSizer(self.sizer)
但是,这给了我很多围绕绘图的填充、不必要的轴和标签,并且它会自动缩放图像以适应可视区域。像素质量仍然存在,但需要添加 mpl 工具栏并手动平移,如果平移太远,您可能会丢失图像。
【问题讨论】:
标签: python numpy matplotlib wxwidgets