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)
Exemple #2
0
 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)
Exemple #3
0
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])
Exemple #4
0
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:
Exemple #5
0
    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')
Exemple #6
0
    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
Exemple #7
0
#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]: