在wx中使用matplotlib显示numpy数组

时间:2011-06-29 16:30:12

标签: python numpy matplotlib wxwidgets

我有一个巨大的numpy ndarray形状(M x N x 3)和数据类型float32。我希望图片只显示在附加wx.Frame的{​​{1}}中。我想要100%缩放图像,非常重要的是不会发生数据丢失。这些是超高分辨率的X射线图像,需要保持浮点值。

到目前为止,wx.ScrolledWindow功能已失败,因为它们只接受8位整数的ndarrays。不好。

PIL成像库也只能处理8位,还不够。

到目前为止,我发现唯一足够的库是matplotlib,但是我无法让matplotlib显示我想要的方式。这让我很接近:

wx.Image

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.figure.figimage(ndarray)     
        self.sizer.Add(self.canvas, 1, wx.EXPAND)  
        self.scroll.SetSizer(self.sizer)

然而,这给了我很多围绕绘图,不必要的轴和标签的填充,并且它自动缩放图像以适合可视区域。像素质量仍然存在,但需要添加mpl工具栏并手动平移,如果平移得太远,您可能会失去对图像的跟踪。

1 个答案:

答案 0 :(得分:1)

我找到了解决方案:

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)
     h, w, r = ndarray.shape
     self.figure = plt.Figure((w/72.0,h/72.0), 72)  #manually determine the figure size in inches
     self.canvas = FigureCanvasWxAgg(self.scroll, -1, self.figure)  
     self.axes = self.figure.add_axes([0.0, 0.0, 1.0, 1.0]) #size of axes to match size of figure
     self.axes.imshow(ndarray) 

因此关键是手动将图形的大小设置为图像的完整大小(以英寸为单位),然后将图形的轴设置为相同的大小。这阻止了mpl自动将我的图像调整到可视区域。我也放弃了sizer,因为我手动调整了滚动条的虚拟区域,图形和轴的大小。现在,如果我能摆脱顶部的数字填充,我就会全力以赴。