Пример #1
0
def edit_histogram_gui(hist):
	items = []
	binSlider = SliderLabel(0)
	binSlider.setMinimum(1)
	binSlider.setMaximum(len(hist.plot_data))
	binSlider.setValue(hist.n_bins)
	items.append({'name': 'Bins', 'string': 'Bins', 'object': binSlider})
	bd = BaseDialog(items, "Histogram options", 'Set the number of bins in the histogram')
	bd.accepted.connect(lambda : hist.setData(n_bins=binSlider.value()))
	bd.rejected.connect(hist.reset)
	bd.changeSignal.connect(lambda : hist.preview(n_bins=binSlider.value()))
	bd.show()
	g.m.dialog = bd
Пример #2
0
def edit_histogram_gui(hist):
    items = []
    binSlider = SliderLabel(0)
    binSlider.setMinimum(1)
    binSlider.setMaximum(len(hist.plot_data))
    binSlider.setValue(hist.n_bins)
    items.append({'name': 'Bins', 'string': 'Bins', 'object': binSlider})
    bd = BaseDialog(items, "Histogram options",
                    'Set the number of bins in the histogram')
    bd.accepted.connect(lambda: hist.setData(n_bins=binSlider.value()))
    bd.rejected.connect(hist.reset)
    bd.changeSignal.connect(lambda: hist.preview(n_bins=binSlider.value()))
    bd.show()
    g.m.dialog = bd
class Volume_Viewer(QWidget):
    closeSignal=Signal()

    def show_wo_focus(self):
        self.show()
        self.window.activateWindow()  # for Windows
        self.window.raise_()  # for MacOS

    def __init__(self,window=None,parent=None):
        super(Volume_Viewer,self).__init__(parent) ## Create window with ImageView widget
        g.m.volume_viewer=self
        window.lostFocusSignal.connect(self.hide)
        window.gainedFocusSignal.connect(self.show_wo_focus)
        self.window=window
        self.setWindowTitle('Light Sheet Volume View Controller')
        self.setWindowIcon(QIcon('images/favicon.png'))
        self.setGeometry(QRect(422, 35, 222, 86))
        self.layout = QVBoxLayout()
        self.vol_shape=window.volume.shape
        mv,mz,mx,my=window.volume.shape
        self.currentAxisOrder=[0,1,2,3]
        self.current_v_Index=0
        self.current_z_Index=0
        self.current_x_Index=0
        self.current_y_Index=0
        
        self.formlayout=QFormLayout()
        self.formlayout.setLabelAlignment(Qt.AlignRight)
        
        self.xzy_position_label=QLabel('Z position')
        self.zSlider=SliderLabel(0)
        self.zSlider.setRange(0,mz-1)
        self.zSlider.label.valueChanged.connect(self.zSlider_updated)
        self.zSlider.slider.mouseReleaseEvent=self.zSlider_release_event
        
        self.sideViewOn=CheckBox()
        self.sideViewOn.setChecked(False)
        self.sideViewOn.stateChanged.connect(self.sideViewOnClicked)
        
        self.sideViewSide = QComboBox(self)
        self.sideViewSide.addItem("X")
        self.sideViewSide.addItem("Y")
        
        self.MaxProjButton = QPushButton('Max Intenstiy Projection')
        self.MaxProjButton.pressed.connect(self.make_maxintensity)
        
        self.exportVolButton = QPushButton('Export Volume')
        self.exportVolButton.pressed.connect(self.export_volume)
        
        self.formlayout.addRow(self.xzy_position_label,self.zSlider)
        self.formlayout.addRow('Side View On',self.sideViewOn)
        self.formlayout.addRow('Side View Side',self.sideViewSide)
        self.formlayout.addRow('', self.MaxProjButton)
        self.formlayout.addRow('', self.exportVolButton)
        
        self.layout.addWidget(self.zSlider)
        self.layout.addLayout(self.formlayout)
        self.setLayout(self.layout)
        self.setGeometry(QRect(381, 43, 416, 110))
        self.show()

    def closeEvent(self, event):
        event.accept() # let the window close
        
    def zSlider_updated(self,z_val):
        self.current_v_Index=self.window.currentIndex
        vol=self.window.volume
        testimage=np.squeeze(vol[self.current_v_Index,z_val,:,:])
        viewRect = self.window.imageview.view.targetRect()
        self.window.imageview.setImage(testimage,autoLevels=False)
        self.window.imageview.view.setRange(viewRect, padding = 0)
        self.window.image = testimage
        
    def zSlider_release_event(self,ev):
        vol=self.window.volume
        if self.currentAxisOrder[1]==1: # 'z'
            self.current_z_Index=self.zSlider.value()
            image=np.squeeze(vol[:,self.current_z_Index,:,:])
        elif self.currentAxisOrder[1]==2: # 'x'
            self.current_x_Index=self.zSlider.value()
            image=np.squeeze(vol[:,self.current_x_Index,:,:])
        elif self.currentAxisOrder[1]==3: # 'y'
            self.current_y_Index=self.zSlider.value()
            image=np.squeeze(vol[:,self.current_y_Index,:,:])

        viewRect = self.window.imageview.view.viewRect()
        self.window.imageview.setImage(image,autoLevels=False)
        self.window.imageview.view.setRange(viewRect, padding=0)
        self.window.image = image
        self.window.imageview.setCurrentIndex(self.current_v_Index)
        self.window.activateWindow()  # for Windows
        self.window.raise_()  # for MacOS
        QSlider.mouseReleaseEvent(self.zSlider.slider, ev)
    
    def sideViewOnClicked(self, checked):
        self.current_v_Index=self.window.currentIndex
        vol=self.window.volume
        if checked==2: #checked=True
            assert self.currentAxisOrder==[0,1,2,3]
            side = self.sideViewSide.currentText()
            if side=='X':
                vol=vol.swapaxes(1,2)
                self.currentAxisOrder=[0,2,1,3]
                vol=vol.swapaxes(2,3)
                self.currentAxisOrder=[0,2,3,1]
            elif side=='Y':
                vol=vol.swapaxes(1,3)
                self.currentAxisOrder=[0,3,2,1]
        else: #checked=False
            if self.currentAxisOrder == [0,3,2,1]:
                vol=vol.swapaxes(1,3)
                self.currentAxisOrder=[0,1,2,3]
            elif self.currentAxisOrder == [0,2,3,1]:
                vol=vol.swapaxes(2,3)
                vol=vol.swapaxes(1,2)
                self.currentAxisOrder=[0,1,2,3]
        if self.currentAxisOrder[1]==1: # 'z'
            idx=self.current_z_Index
            self.xzy_position_label.setText('Z position')
            self.zSlider.setRange(0,self.vol_shape[1]-1)
        elif self.currentAxisOrder[1]==2: # 'x'
            idx=self.current_x_Index
            self.xzy_position_label.setText('X position')
            self.zSlider.setRange(0,self.vol_shape[2]-1)
        elif self.currentAxisOrder[1]==3: # 'y'
            idx=self.current_y_Index
            self.xzy_position_label.setText('Y position')
            self.zSlider.setRange(0,self.vol_shape[3]-1)
        image=np.squeeze(vol[:,idx,:,:])
        self.window.imageview.setImage(image,autoLevels=False)
        self.window.volume=vol
        self.window.imageview.setCurrentIndex(self.current_v_Index)
        self.zSlider.setValue(idx)

    def make_maxintensity(self):
        vol=self.window.volume
        new_vol=np.max(vol,1)
        if self.currentAxisOrder[1]==1: # 'z'
            name='Max Z projection'
        elif self.currentAxisOrder[1]==2: # 'x'
            name = 'Max X projection'
        elif self.currentAxisOrder[1]==3: # 'y'
            name = 'Max Y projection'
        Window(new_vol, name=name)
        
    def export_volume(self):
        vol=self.window.volume
        export_path = QFileDialog.getExistingDirectory(g.m, "Select a parent folder to save into.", expanduser("~"), QFileDialog.ShowDirsOnly)
        export_path = os.path.join(export_path, 'light_sheet_vols')
        i=0
        while os.path.isdir(export_path+str(i)):
            i+=1
        export_path=export_path+str(i)
        os.mkdir(export_path) 
        for v in np.arange(len(vol)):
            A=vol[v]
            filename=os.path.join(export_path,str(v)+'.tiff')
            if len(A.shape)==3:
                A=np.transpose(A,(0,2,1)) # This keeps the x and the y the same as in FIJI
            elif len(A.shape)==2:
                A=np.transpose(A,(1,0))
            tifffile.imsave(filename, A)
Пример #4
0
class Drift_Correction(BaseProcess):
    '''Draw rectangular ROIs around tracer locations to track movement over time. Locate the center coordinates and correct the image for drift
    '''
    def __init__(self):
        super().__init__()
        findButton = QPushButton("Find Centers")
        findButton.pressed.connect(self.find_centers)
        self.slider = SliderLabel()
        self.slider.setRange(0, 10)
        self.slider.valueChanged.connect(self.plotCenters)
        self.items.append({
            'name': 'findButton',
            'string': 'Locate centroids',
            'object': findButton
        })
        self.items.append({
            'name': 'smoothness',
            'string': 'Drift Smoothness',
            'object': self.slider
        })

        # Enable antialiasing for prettier plots
        pg.setConfigOptions(antialias=True)
        self.scatter = pg.ScatterPlotItem()

        self.p1 = pg.PlotWidget(title="X Shift")
        self.p2 = pg.PlotWidget(title="Y Shift")

    def gui(self):
        super().gui()
        self.ui.layout.insertWidget(0, self.p1)
        self.ui.layout.insertWidget(1, self.p2)
        self.ui.resize(1000, 600)

    def plotCenters(self):
        self.p1.clear()
        self.p2.clear()
        for r in self.rois:
            centers = np.copy(r['centers'])
            #self.p1.plot(y=centers[:, 0] / np.average(centers[:, 0]), pen=r['roi'].pen)
            #self.p2.plot(y=centers[:, 1] / np.average(centers[:, 1]), pen=r['roi'].pen)
            self.p1.plot(y=gf(centers[:, 0], self.slider.value()),
                         pen=r['roi'].pen)
            self.p2.plot(y=gf(centers[:, 1], self.slider.value()),
                         pen=r['roi'].pen)

    def __call__(self, keepSourceWindow=False):
        xx, yy = [], []
        for i in range(len(self.p1.plotItem.items)):
            xx.append(self.p1.plotItem.items[i].getData()[1])
            yy.append(self.p2.plotItem.items[i].getData()[1])
        diffs = np.mean([xx, yy], 1).T
        diffs = -1 * diffs + diffs[0]

        im = np.copy(g.m.currentWindow.image)
        for i, sh in enumerate(diffs):
            g.m.statusBar().showMessage("shifting frame %d of %d" %
                                        (i, len(diffs)))
            im[i] = shift(im[i], sh)
            QApplication.instance().processEvents()
        return Window(im)

    def find_centers(self):
        win = g.m.currentWindow
        im = win.image
        mx, my = win.imageDimensions()
        self.rois = []
        g.centers = []
        for roi in g.m.currentWindow.rois:
            mask = roi.mask
            mask = mask[(mask[:, 0] >= 0) * (mask[:, 0] < mx) *
                        (mask[:, 1] >= 0) * (mask[:, 1] < my)]

            xx = mask[:, 0]
            yy = mask[:, 1]
            centers = []

            for frame in im:
                gframe = gf(frame, 1)
                x0, y0 = np.unravel_index(gframe.argmax(), gframe.shape)
                #centers.append([x0, y0])
                #vals = fitGaussian(frame, (x0, y0, 1, 3))
                #x1, y1, a, b = vals[0]
                centers.append([x0, y0])
            self.rois.append({'roi': roi, 'centers': centers})
        self.plotCenters()
Пример #5
0
class Drift_Correction(BaseProcess):
    '''Draw rectangular ROIs around tracer locations to track movement over time. Locate the center coordinates and correct the image for drift
    '''
    def __init__(self):
        super().__init__()
        findButton = QPushButton("Find Centers")
        findButton.pressed.connect(self.find_centers)
        self.slider = SliderLabel()
        self.slider.setRange(0, 10)
        self.slider.valueChanged.connect(self.plotCenters)
        self.items.append({'name':'findButton','string':'Locate centroids','object':findButton})
        self.items.append({'name':'smoothness', 'string': 'Drift Smoothness', 'object':self.slider})

        # Enable antialiasing for prettier plots
        pg.setConfigOptions(antialias=True)
        self.scatter = pg.ScatterPlotItem()
        
        self.p1 = pg.PlotWidget(title="X Shift")
        self.p2 = pg.PlotWidget(title="Y Shift")

    def gui(self):
        super().gui()
        self.ui.layout.insertWidget(0, self.p1)
        self.ui.layout.insertWidget(1, self.p2)
        self.ui.resize(1000, 600)

    def plotCenters(self):
        self.p1.clear()
        self.p2.clear()
        for r in self.rois:
            centers = np.copy(r['centers'])
            #self.p1.plot(y=centers[:, 0] / np.average(centers[:, 0]), pen=r['roi'].pen)
            #self.p2.plot(y=centers[:, 1] / np.average(centers[:, 1]), pen=r['roi'].pen)
            self.p1.plot(y=gf(centers[:, 0], self.slider.value()), pen=r['roi'].pen)
            self.p2.plot(y=gf(centers[:, 1], self.slider.value()), pen=r['roi'].pen)

    def __call__(self, keepSourceWindow=False):
        xx, yy = [], []
        for i in range(len(self.p1.plotItem.items)):
            xx.append(self.p1.plotItem.items[i].getData()[1])
            yy.append(self.p2.plotItem.items[i].getData()[1])
        diffs = np.mean([xx, yy], 1).T
        diffs = -1 * diffs + diffs[0]
        
        im = np.copy(g.m.currentWindow.image)
        for i, sh in enumerate(diffs):
            g.m.statusBar().showMessage("shifting frame %d of %d" % (i, len(diffs)))
            im[i] = shift(im[i], sh)
            QApplication.instance().processEvents()
        return Window(im)


    def find_centers(self):
        win = g.m.currentWindow
        im = win.image
        mx,my=win.imageDimensions()
        self.rois = []
        g.centers = []
        for roi in g.m.currentWindow.rois:
            mask = roi.mask
            mask=mask[(mask[:,0]>=0)*(mask[:,0]<mx)*(mask[:,1]>=0)*(mask[:,1]<my)]

            xx=mask[:,0]; yy=mask[:,1]
            centers = []

            for frame in im:
                gframe = gf(frame, 1)
                x0, y0 = np.unravel_index(gframe.argmax(), gframe.shape)
                #centers.append([x0, y0])
                #vals = fitGaussian(frame, (x0, y0, 1, 3))
                #x1, y1, a, b = vals[0]
                centers.append([x0, y0])
            self.rois.append({'roi': roi, 'centers': centers})
        self.plotCenters()