2013-02-01 51 views
0

我有一個簡短的matplotlib模塊,我在這裏做一些基本的圖像分析,刪除切片,註冊,求和和保存。不過,我想添加一個重置按鈕來重新初始化模塊,將圖像數據恢復到初始狀態。重新初始化python matplotlib模塊 - 重置按鈕

基本上,如果我有一個組成動態數據集的2D圖像列表。我希望能夠刪除幀,註冊圖像,並最終創建一個總結圖像。爲此,我操縱列表raw_dicom_stack。但是,如果出現問題,我希望另一個按鈕重置,它將重置raw_dicom_stack並使用原始數據重新啓動該類。我複製raw_dicom_stack的內容reset_stack早期並重置我嘗試:

我曾嘗試:

def reset(self, event): 
    self.__init__(self.reset_stack, self.nframes, self.ds) 

但這種崩潰的模塊,我沒有錯誤消息。我哪裏錯了?

def main(): 
    root = Tk() 
    root.withdraw() 
    #Default DMSA image directory 
    IMAGE_DIR = '/home/nm/Python/DMSA/dmsa_examples/dynamics/' 
    filename = tkFileDialog.askopenfilename(parent=root,initialdir=IMAGE_DIR, title='Select dicom image') 
    if filename == '': 
     quit() 

    ds = dicom.read_file(filename) 
    pix = ds.pixel_array 
    #find out size of pixel array 
    #print 'dicom image has x,y,z dimensions %d,%d,%d' %(int(pix.shape[0]), int(pix.shape[1]), int(pix.shape[2])) 
    raw_dicom_stack = [] 

    for x in range(pix.shape[0]/2): 
     raw_dicom_stack.append(pix[x,:,:]) 


    nframes = pix.shape[0]/2; 
    # Visualize it 
    viewer = VolumeViewer(raw_dicom_stack, nframes, ds) 
    viewer.show() 

class VolumeViewer(object): 
    def __init__(self, raw_dicom_stack, nframes, ds): 

     self.raw_dicom_stack = raw_dicom_stack 
     self.nframes = nframes 
     self.summed_image = np.zeros((self.raw_dicom_stack[0].shape[0],self.raw_dicom_stack[0].shape[1])) 
     self.frame = 0 
     self.frames_delete = 0 
     self.ds = ds 
     self.reset_stack = raw_dicom_stack 


     # Plot the first slice of the image 
     self.fig, self.ax = plt.subplots() 
     self.im = self.ax.imshow(np.array(raw_dicom_stack[0]), cmap = cm.gray) 


    def update(self, value): 
     self.frame = int(self.nframes * value) 
     # Update the image data 
     dat = np.array(self.raw_dicom_stack[self.frame]) 
     self.im.set_data(dat) 
     self.im.set_clim([dat.min(), dat.max()]) 
     # Redraw the plot 
     self.fig.canvas.draw()  

    def add(self,event): 
     if self.query_add == True: 
      print "Image series has already summed" 
     else: 
      for x in range(self.nframes): 
       self.summed_image += self.raw_dicom_stack[x] 
      del self.raw_dicom_stack[:] 
      self.raw_dicom_stack.append(self.summed_image[:,:]) 
      self.nframes = len(self.raw_dicom_stack) 

      # Update the image data 
      dat = np.array(self.raw_dicom_stack[0]) 
      self.im.set_data(dat) 
      self.slider.reset() 
      self.im.set_clim([dat.min(), dat.max()]) 
      # Redraw the plot 
      self.fig.canvas.draw() 

      self.query_add = True 
      #rezero summed_image 
      #summed_image = np.zeros((self.summed_image.shape[0],self.summed_image.shape[1])) 


    def show(self): 
     plt.show() 

    def reset(self, event): 

     #self.summed_image = np.zeros((self.raw_dicom_stack[0].shape[0],self.raw_dicom_stack[0].shape[1])) 
     #self.query_register = False 
     #self.query_add = False 
     self.__init__(self.reset_stack, self.nframes, self.ds) 

    def quit(self,event): 
     quit() 

if __name__ == '__main__': 
    main() 
+0

什麼'reset' –

+0

你得到調用錯誤下面的代碼也是它可能是你提供說明該問題的小例子,運行該代碼有點困難,沒有手頭上的所有依賴項。 –

+0

@MattiLyra我沒有收到任何錯誤消息。我重寫了我的問題,並刪除了大部分與問題無關的代碼,希望它現在更有意義 – moadeep

回答

1

運行與Python 2.7.3工作完全正常

import numpy as np 

class VolumeViewer(object): 
    def __init__(self, raw_dicom_stack, nframes, ds): 

     self.raw_dicom_stack = raw_dicom_stack 
     self.nframes = nframes 
     self.summed_image = np.zeros((self.raw_dicom_stack[0].shape[0],self.raw_dicom_stack[0].shape[1])) 
     self.frame = 0 
     self.frames_delete = 0 
     self.ds = ds 
     self.reset_stack = raw_dicom_stack 


     # Plot the first slice of the image 
     self.fig, self.ax = plt.subplots() 
     self.im = self.ax.imshow(np.array(raw_dicom_stack[0]), cmap = cm.gray) 


    def update(self, value): 
     self.frame = int(self.nframes * value) 
     # Update the image data 
     dat = np.array(self.raw_dicom_stack[self.frame]) 
     self.im.set_data(dat) 
     self.im.set_clim([dat.min(), dat.max()]) 
     # Redraw the plot 
     self.fig.canvas.draw()  

    def add(self,event): 
     if self.query_add == True: 
      print "Image series has already summed" 
     else: 
      for x in range(self.nframes): 
       self.summed_image += self.raw_dicom_stack[x] 
      del self.raw_dicom_stack[:] 
      self.raw_dicom_stack.append(self.summed_image[:,:]) 
      self.nframes = len(self.raw_dicom_stack) 

      # Update the image data 
      dat = np.array(self.raw_dicom_stack[0]) 
      self.im.set_data(dat) 
      self.slider.reset() 
      self.im.set_clim([dat.min(), dat.max()]) 
      # Redraw the plot 
      self.fig.canvas.draw() 

      self.query_add = True 
      #rezero summed_image 
      #summed_image = np.zeros((self.summed_image.shape[0],self.summed_image.shape[1])) 


    def show(self): 
     plt.show() 

    def reset(self, event): 

     #self.summed_image = np.zeros((self.raw_dicom_stack[0].shape[0],self.raw_dicom_stack[0].shape[1])) 
     #self.query_register = False 
     #self.query_add = False 
     self.__init__(self.reset_stack, self.nframes, self.ds) 

    def quit(self,event): 
     quit() 

if __name__ == '__main__': 
    viewer = VolumeViewer(np.zeros((2,10,10)), 4, None) 
    viewer.reset() 
+0

@MattLyra - 我遇到與掛起程序相同的問題。有沒有更好的方式來重新啓動類,當按鈕被選中 – moadeep

+0

那麼你總是可以嘗試從'__init__'分離代碼到重置,但我不認爲這會幫助,因爲它可能不會調用'__init__'失敗但有一些與實際重新初始化。你是否已經通過調試器中的init代碼查看它掛起的位置? –

+0

問題解決。這與我複製raw_dicom_stack的方式有關 – moadeep