gpt4 book ai didi

python - 在 wx 中使用 matplotlib 显示 numpy 数组

转载 作者:太空宇宙 更新时间:2023-11-03 19:29:45 24 4
gpt4 key购买 nike

我有一个巨大的 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 工具栏并手动平移,如果平移太远,您可能会失去对图像的跟踪。

最佳答案

我找到了解决方案:

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 自动将我的图像大小调整为可视区域。我还放弃了大小调整器,因为我手动调整了滚动条的虚拟区域、图形和轴的大小。现在,如果我能去掉人物顶部的填充,我就万事大吉了。

关于python - 在 wx 中使用 matplotlib 显示 numpy 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6524053/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com