def drawROI(self): # Custom ROI for selecting an image region handle1_x = self.win.rois[0].getLocalHandlePositions()[0][1].x() handle1_y = self.win.rois[0].getLocalHandlePositions()[0][1].y() handle2_x = self.win.rois[0].getLocalHandlePositions()[1][1].x() handle2_y = self.win.rois[0].getLocalHandlePositions()[1][1].y() #imageHeight = self.win.imageDimensions()[1] #angle = math.degrees(math.atan2(handle2_y-handle1_y , handle2_x-handle1_x)) def newY(handle1_y, handle2_y): diff = abs(handle1_y - handle2_y) if handle2_y - handle1_y >= 0: return handle1_y - diff else: return handle1_y + diff self.roi = pg.LineROI( [handle1_x, handle1_y], [handle2_x, newY(handle1_y, handle2_y)], width=self.width, pen=(1, 9)) #roi.addScaleHandle([0.5, 1], [0.5, 0.5]) #roi.addScaleHandle([0, 0.5], [0.5, 0.5]) self.win.removeAllROIs() self.win.imageview.addItem(self.roi)
def setROI(self, shape): make = [pg.LineROI, pg.RectROI] roi = None if shape == 0: roi = pg.LineROI([0, 60], [20, 80], width=1, pen=(1, 9)) elif shape == 1: roi = pg.RectROI([20, 20], [20, 20], pen=(0, 9)) else: roi = pg.CircleROI([80, 50], [20, 20], pen=(4, 9)) self.rois.append(roi) self.view.addItem(roi)
def test_LineROI_coords(p1, p2): pw = pg.plot() lineroi = pg.LineROI(p1, p2, width=0.5, pen="r") pw.addItem(lineroi) # first two handles are the scale-rotate handles positioned by pos1, pos2 for expected, (name, scenepos) in zip([p1, p2], lineroi.getSceneHandlePositions()): got = lineroi.mapSceneToParent(scenepos) assert math.isclose(got.x(), expected[0]) assert math.isclose(got.y(), expected[1])
label1 = w1.addLabel(text, row=0, col=0) v1a = w1.addViewBox(row=1, col=0, lockAspect=True) v1b = w1.addViewBox(row=2, col=0, lockAspect=True) img1a = pg.ImageItem(arr) v1a.addItem(img1a) img1b = pg.ImageItem() v1b.addItem(img1b) v1a.disableAutoRange('xy') v1b.disableAutoRange('xy') v1a.autoRange() v1b.autoRange() rois = [] rois.append(pg.RectROI([20, 20], [20, 20], pen=(0, 9))) rois[-1].addRotateHandle([1, 0], [0.5, 0.5]) rois.append(pg.LineROI([0, 60], [20, 80], width=5, pen=(1, 9))) rois.append( pg.MultiRectROI([[20, 90], [50, 60], [60, 90]], width=5, pen=(2, 9))) rois.append(pg.EllipseROI([60, 10], [30, 20], pen=(3, 9))) rois.append(pg.CircleROI([80, 50], [20, 20], pen=(4, 9))) #rois.append(pg.LineSegmentROI([[110, 50], [20, 20]], pen=(5,9))) rois.append( pg.PolyLineROI([[80, 60], [90, 30], [60, 40]], pen=(6, 9), closed=True)) def update(roi): img1b.setImage(roi.getArrayRegion(arr, img1a), levels=(0, arr.max())) v1b.autoRange() for roi in rois:
def setup(self): self.settings.New('drift_correct_type', dtype=str, initial='Pairwise', choices=('Pairwise', 'Pairwise + Running Avg')) self.settings.New('drift_correct_adc_chan', dtype=int) self.settings.New('drift_correct', dtype=bool) self.settings.New('overwrite_alignment', dtype=bool) # if drift corrected datasets already exist, overwrite? self.settings.New('run_preprocess', dtype=bool) self.settings.get_lq('run_preprocess').add_listener(self.preprocess) self.settings.New('use_preprocess', dtype=bool, initial=True) self.settings.get_lq('use_preprocess').add_listener(self.load_new_data) self.settings.New('update_auger_map', dtype=bool, initial=False) self.settings.get_lq('update_auger_map').add_listener( self.update_current_auger_map) self.settings.New('equalize_detectors', dtype=bool) self.settings.New('normalize_by_pass_energy', dtype=bool) self.settings.New('spatial_smooth_sigma', dtype=float, vmin=0.0) self.settings.New('spectral_smooth_type', dtype=str, choices=['None', 'Gaussian', 'Savitzky-Golay'], initial='None') self.settings.New('spectral_smooth_gauss_sigma', dtype=float, vmin=0.0) self.settings.New('spectral_smooth_savgol_width', dtype=int, vmin=0) self.settings.New('spectral_smooth_savgol_order', dtype=int, vmin=0, initial=2) # Assume same tougaard parameters everywhere self.settings.New('subtract_tougaard', dtype=bool) self.settings.New('R_loss', dtype=float) self.settings.New('E_loss', dtype=float) auger_lqs = [ 'equalize_detectors', 'normalize_by_pass_energy', 'spatial_smooth_sigma', 'spectral_smooth_type', 'spectral_smooth_gauss_sigma', 'spectral_smooth_savgol_width', 'spectral_smooth_savgol_order', 'subtract_tougaard', 'R_loss', 'E_loss' ] # Link all the auger spectrum lqs to the update current auger map listener for alq in auger_lqs: self.settings.get_lq(alq).add_listener( self.update_current_auger_map) self.settings.New('ke0_start', dtype=float) self.settings.New('ke0_stop', dtype=float) self.settings.New('ke1_start', dtype=float) self.settings.New('ke1_stop', dtype=float) for lqname in ['ke0_start', 'ke0_stop', 'ke1_start', 'ke1_stop']: self.settings.get_lq(lqname).add_listener( self.on_change_ke_settings) # Subtract the B section (ke1_start through ke1_stop) by a power law fit self.settings.New('subtract_ke1', dtype=str, choices=['None', 'Linear', 'Power Law'], initial='None') self.settings.get_lq('subtract_ke1').add_listener( self.update_current_auger_map) #Math mode now updates automatically on change self.settings.New('math_mode', dtype=str, initial='A') self.settings.get_lq('math_mode').add_listener( self.on_change_math_mode) self.settings.New('AB_mode', dtype=str, choices=['Mean', 'Integral'], initial='Mean') self.settings.get_lq('AB_mode').add_listener( self.on_change_ke_settings) self.settings.New('spectrum_over_ROI', dtype=bool) self.settings.get_lq('spectrum_over_ROI').add_listener( self.on_change_spectrum_over_ROI) self.settings.New('analysis_over_spectrum', dtype=bool) self.settings.get_lq('analysis_over_spectrum').add_listener( self.update_current_auger_map) self.settings.New('mean_spectrum_only', dtype=bool, initial=False) self.settings.get_lq('mean_spectrum_only').add_listener( self.on_change_mean_spectrum_only) # Make plots on white background #pg.setConfigOption('background', 'w') #pg.setConfigOption('foreground', 'k') self.ui = self.dockarea = dockarea.DockArea() # List of settings to include in preprocessing tab names_prep = [ 'drift_correct_type', 'drift_correct_adc_chan', 'drift_correct', 'overwrite_alignment', 'run_preprocess' ] self.setdock = self.dockarea.addDock( name='Settings', position='left', widget=self.settings.New_UI(exclude=names_prep)) self.prepdock = self.dockarea.addDock( name='Preprocess', position='left', widget=self.settings.New_UI(include=names_prep)) self.dockarea.moveDock(self.setdock, 'above', self.prepdock) # Images self.imview_sem0_stack = pg.ImageView() self.imview_sem0_stack.getView().invertY(False) # lower left origin self.imdockA_stack = self.dockarea.addDock( name='SE2 Image Stack', widget=self.imview_sem0_stack) self.imview_sem1_stack = pg.ImageView() self.imview_sem1_stack.getView().invertY(False) # lower left origin self.imdockB_stack = self.dockarea.addDock( name='InLens Image Stack', position='right', widget=self.imview_sem1_stack) self.imview_sem0 = pg.ImageView() self.imview_sem0.getView().invertY(False) # lower left origin self.imdockA = self.dockarea.addDock(name='SE2 Mean Image', widget=self.imview_sem0) self.imview_sem1 = pg.ImageView() self.imview_sem1.getView().invertY(False) # lower left origin self.imdockB = self.dockarea.addDock(name='InLens Mean Image', widget=self.imview_sem1) self.imview_auger = pg.ImageView() self.imview_auger.getView().invertY(False) # lower left origin self.imdockAuger = self.dockarea.addDock(name='Auger Map', widget=self.imview_auger) self.im_auger = self.imview_auger.getImageItem() # tab image and auger map docks self.dockarea.moveDock(self.imdockA_stack, 'above', self.imdockB_stack) self.dockarea.moveDock(self.imdockB, 'above', self.imdockA_stack) self.dockarea.moveDock(self.imdockA, 'above', self.imdockB) self.dockarea.moveDock(self.imdockAuger, 'above', self.imdockA) # Polygon ROI self.poly_roi = pg.PolyLineROI([[20, 0], [20, 20], [0, 20]], pen=pg.mkPen((255, 0, 0), dash=[5, 5], width=1.5), closed=True) #self.poly_roi = pg.RectROI([20, 20], [20, 20], pen=(0,9)) #self.poly_roi = pg.CircleROI((0,0), (10,10) , movable=True, pen=(0,9)) #self.poly_roi.addTranslateHandle((0.5,0.5)) self.imview_auger.getView().addItem(self.poly_roi) self.poly_roi.sigRegionChanged[object].connect(self.on_change_roi) # Scalebar ROI self.scalebar = pg.LineROI([5, 5], [25, 5], width=0, pen=pg.mkPen(color=(255, 255, 0), width=4.5)) self.imview_auger.getView().addItem(self.scalebar) # Create initial scalebar w/ text self.scale_text = pg.TextItem(color=(255, 255, 0), anchor=(0.5, 1)) self.imview_auger.getView().addItem(self.scale_text) self.scale_text.setFont(pg.QtGui.QFont('Arial', pointSize=11)) self.scalebar.sigRegionChanged[object].connect(self.on_change_scalebar) # Change handle colors so they don't appear by default, but do when hovered over scale_handles = self.scalebar.getHandles() scale_handles[0].currentPen.setColor(pg.mkColor(255, 255, 255, 0)) scale_handles[1].currentPen.setColor(pg.mkColor(255, 255, 255, 0)) # This disables the middle handle that allows line width change scale_handles[2].setOpacity(0.0) # Spectrum plot self.graph_layout = pg.GraphicsLayoutWidget() self.spec_plot = self.graph_layout.addPlot() self.legend = self.spec_plot.addLegend() self.spec_plot.setLabel('bottom', 'Electron Kinetic Energy') self.spec_plot.setLabel('left', 'Intensity (Hz)') #self.rect_plotdata = self.spec_plot.plot() #self.point_plotdata = self.spec_plot.plot(pen=(0,9)) self.dockarea.addDock(name='Spec Plot', position='bottom', widget=self.graph_layout) self.lr0 = pg.LinearRegionItem(values=[0, 1], brush=QtGui.QBrush( QtGui.QColor(0, 0, 255, 50))) self.lr1 = pg.LinearRegionItem(values=[2, 3], brush=QtGui.QBrush( QtGui.QColor(255, 0, 0, 50))) for lr in (self.lr0, self.lr1): lr.setZValue(10) self.spec_plot.addItem(lr, ignoreBounds=True) lr.sigRegionChangeFinished.connect(self.on_change_regions) self.chan_plotlines = [] # define plotline color scheme going from orange -> yellow -> green R = np.linspace(220, 0, 4) G = np.linspace(220, 100, 4) plot_colors = [(R[0], G[0], 0), (R[1], G[0], 0), (R[0], G[1], 0), (R[2], G[0], 0), (R[0], G[2], 0), (R[3], G[0], 100), (R[0], G[3], 0)] for ii in range(7): self.chan_plotlines.append( self.spec_plot.plot([0], pen=pg.mkPen(color=plot_colors[ii], width=2), name='chan ' + str(ii), width=20)) self.total_plotline = self.spec_plot.plot(pen=pg.mkPen(color=(0, 0, 0), width=3), name='mean')
def setROI(self, shape, rect=((10, 10), (20, 20))): '''ROI 추가를 위한 메서드. 좌상, 우하 좌표와, 모양을 인자로 받아 선형, 사각형, 다선형, 삼각형, 원형의 ROI를 추가한다''' make = [pg.LineROI, pg.RectROI] roi_lst = [] roi_id = len(self.roi_lst) def update(roi): '''ROI에 변화가 생겼을 대에 이를 다른 뷰에 적용시킨다''' state = roi.saveState() for r in self.roi_lst[roi_id]: r.setAngle(state['angle'], update=False) r.setPos(state['pos'], update=False) r.setSize(state['size'], update=False) def clicked(roi): '''ROI 우클릭 시에 팝업 윈도우를 보여준다''' ROIPopup(roi, self.ui) print "clicked" (x1, y1), (x2, y2) = rect x = min(x1, x2) y = min(y1, y2) xlen = abs(x1 - x2) ylen = abs(y1 - y2) for widget in self.widget_lst: if shape == 0: roi = pg.LineROI([x1, y1], [x2, 2 * y1 - y2], width=0, pen=(1, 9)) elif shape == 1: roi = pg.RectROI([x, y], [xlen, ylen], pen=(3, 9)) elif shape == 2: roi = pg.PolyLineROI( [[x, y + ylen], [x + xlen / 4, y], [ x + xlen / 2, y + ylen ], [x + xlen * 3 / 4, y], [x + xlen, y + ylen]], closed=False, pen=(5, 9)) elif shape == 3: roi = pg.PolyLineROI( [[x, y], [x + xlen / 4, y + ylen], [x + xlen / 2, y], [x + xlen * 3 / 4, y + ylen], [x + xlen, y]], closed=False, pen=(7, 9)) elif shape == 4: roi = pg.PolyLineROI( [[x, y], [x + xlen / 2, y + ylen], [x + xlen, y]], closed=True, pen=(9, 9)) elif shape == 5: roi = pg.EllipseROI([x, y], [xlen, ylen], pen=(4, 9)) else: raise Exception("Shape unbound") # 시그널 연결 roi.sigRegionChanged.connect(update) roi.setAcceptedMouseButtons(QtCore.Qt.RightButton) roi.sigClicked.connect(clicked) if shape == 2 or shape == 3 or shape == 4: for seg in roi.segments: seg.sigRegionChanged.connect(update) widget.addItem(roi) roi_lst.append(roi) self.roi_lst.append(roi_lst) return x
#win.addWindow(map1) #ui.graphicsView.useOpenGL() vb = pg.ViewBox() ui.graphicsView.setCentralItem(vb) vb.setAspectLocked() img = pg.ImageItem() vb.addItem(img) ## ROI setting rois = [] # add default roi for i in [0, 1, 2, 3]: y0 = 70 + i * 30 rois.append(pg.RectROI([400, y0], [20, 20])) vb.addItem(rois[i]) bg = pg.LineROI([0, 0], [0, -200], width=5) vb.addItem(bg) # camera2c Player ptr = 0 lastTime = ptime.time() fps = None def update(): global ui, ptr, lastTime, fps, img # Transfer the orign postion and color of ROI and edge if ui.pushButton_roi.isChecked(): wormmap = np.zeros((4, 6)) for i in [0, 1, 2, 3]: