在wx中显示带有matplotlib的numpy数组

2024-06-24 12:24:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个巨大的数字阵列,其形状(mxnx3)和数据类型float32。我希望图像简单地显示在一个wx.Frame中,它附加了一个wx.ScrolledWindow。我想要100%变焦的图像,这是非常重要的,没有数据丢失发生。这些是超高分辨率x射线图像,需要保持为浮点值。在

{cd4{ndays只接受到目前为止的整数能力。无益。在

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:

^{pr2}$

但是,这给了我大量的填充,不必要的轴和标签,它自动缩放图像以适应可视区域。像素质量仍然存在,但需要添加mpl工具栏和手动平移,如果平移太远,可能会丢失图像的轨迹。在


Tags: 图像self区域matplotlibinit数字像素frame
1条回答
网友
1楼 · 发布于 2024-06-24 12:24:27

我找到了一个解决方案:

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,因为我手动调整了滚动条的虚拟区域、图形和轴的大小。现在只要我能去掉上面的填充物,我就都准备好了。在

相关问题 更多 >