2011-06-29 8 views
1

私は形状(M×N×3)とデータ型がfloat32の巨大なnumpy ndarrayを持っています。 wx.ScrolledWindowが添付された画像をwx.Frameに表示するだけです。私は100%ズームで画像を望んでおり、データ損失が発生しないことが非常に重要です。これらは超高解像度のX線画像で、浮動小数点値として使用する必要があります。matplotlibでnumpl配列をwx内に表示

これまでのところ、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ツールバーを追加して手作業でパンニングする必要があります。パンを長すぎるとイメージが失われる可能性があります。

答えて

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は画像を表示可能領域に自動的にサイズ変更することができなくなりました。私は手動でスクロールバーの仮想領域、図形、および軸のサイズを調整したので、サイザーも削除しました。さて、もし私がトップのフィギュアのパディングを取り除くことができれば、私はすべてセットされるだろう。

関連する問題