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
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)
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()
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()