我有一个巨大的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工具栏并手动平移,如果平移得太远,您可能会失去对图像的跟踪。
答案 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,因为我手动调整了滚动条的虚拟区域,图形和轴的大小。现在,如果我能摆脱顶部的数字填充,我就会全力以赴。