【问题标题】:Displaying numpy arrays with matplotlib inside wx在 wx 中使用 matplotlib 显示 numpy 数组
【发布时间】:2011-06-29 16:30:11
【问题描述】:

我有一个巨大的 numpy ndarray,形状 (M x N x 3) 和数据类型 float32。我希望图像简单地显示在附有wx.ScrolledWindowwx.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


    【解决方案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,因为我手动调整了滚动条的虚拟区域、图形和轴的大小。现在,只要我能摆脱顶部的图形填充,我就万事大吉了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-06
      • 2020-08-22
      • 2016-02-23
      • 2015-10-05
      • 2016-07-23
      • 1970-01-01
      • 2019-01-16
      • 2015-01-25
      相关资源
      最近更新 更多