Beispiel #1
0
    def addColorLayer(self, layer=None, name='Unnamed', tip='',
                      color=None, alpha=0.5):
        '''
        add a [layer], a np.array (2d or 3d), as colour overlay to the image
        '''
        if layer is None:
            s = self.image.shape
            if len(s) == 4:  # multi layer color image
                s = s[1:-1]
            elif len(s) == 3:
                if s[-1] == 3:  # single layer color image
                    s = s[:-1]
                else:  # multi layer grey image
                    s = s[1:]
            layer = np.zeros(shape=s)

        if isColor(layer):
            layer = toGray(layer)

        if color is None:
            # set colour as function of the number of colorItems:
            color = pg.intColor(len(self.cItems)).rgb()

        cItem = ColorLayerItem(layer,
                               imageWidget=self,
                               color=color,
                               alpha=alpha
                               )
        name = incrementName(list(self.cItems.keys()), name)
        self.cItems[name] = cItem
        self.view.addItem(cItem)
        self.sigOverlayAdded.emit(cItem, name, tip)
        return cItem
Beispiel #2
0
    def addColorLayer(self, layer=None, name='Unnamed', tip='', 
                      color=None, alpha=0.5):
        '''
        add a [layer], a np.array (2d or 3d), as colour overlay to the image
        '''
        if layer is None:
            s  = self.image.shape
            if len(s) == 4: # multi layer color image
                s = s[1:-1]
            elif len(s) == 3:
                if s[-1] == 3: # single layer color image
                    s = s[:-1]
                else: #multi layer grey image
                    s = s[1:]
            layer = np.zeros(shape=s)  
        
        if isColor(layer):
            layer = toGray(layer)

        if color is None:
            #set colour as function of the number of colorItems:
            color = pg.intColor(len(self.cItems)).rgb()
        
        cItem = ColorLayerItem(layer,
                               imageWidget=self,
                               color=color,
                               alpha=alpha
                               ) 
        name = incrementName(self.cItems.keys(), name)
        self.cItems[name] = cItem
        self.view.addItem(cItem)
        self.sigOverlayAdded.emit(cItem, name, tip)
        return cItem
Beispiel #3
0
    def __init__(self, imagepath, *args, **kwargs):
        super().__init__()
        self.setWindowTitle('Set grid manual')
        flags = self.windowFlags()
        self.setWindowFlags(flags | QtCore.Qt.WindowMaximizeButtonHint)

        self.editor = GridEditor(*args, **kwargs)
        # set image
        img = toGray(imread(imagepath))  # , 'gray')
        self.editor.imageview.setImage(img)

        if 'vertices' not in kwargs:
            # set vertices
            sy, sx = img.shape[:2]
            px, py = sx * 0.2, sy * 0.2

            self.editor.grid.setVertices(
                np.array([[px, py], [px, sy - py], [sx - px, sy - py],
                          [sx - px, py]]))

        layout = QtWidgets.QVBoxLayout()
        layout.addWidget(self.editor)
        self.setLayout(layout)

        btn_done = QtWidgets.QPushButton("Done")
        btn_done.clicked.connect(self.accept)
        self.editor.bottomLayout.addWidget(btn_done, 0, 0)
        self.values = None
 def _process(self):
     img = self.display.widget.image[-1]
     if isColor(img):
         img = toGray(img)
     avg = SNRaverage(SNR(img))
     i = self.pOpt.opts['limits'].index(self.pOpt.value())
     limit = self.SNR_LIMITS[i][1]
     fac = limit / avg
     return fac
    def activate(self):
        
        self._items = []
        self._fns = []
        
        nr = self.pRNRows.value()
        s = self.pSpace.value()
        w = self.display.widget
        vb = w.view.vb
        
        if len(w.image) < 2:
            self.setChecked(False)
            raise Exception('needs multiple images for grid view')
        
        w.setCurrentIndex(0)
        w.display.widget.showTimeline(False)
        
        hist = w.ui.histogram
        s0,s1 = w.image.shape[1:3]
        px,py = s0+s,0
        ir = 1
        for img in w.image[1:]:

            if isColor(img):
                #TODO: I dont know why it returns an error on color ...find out
                print 'only works on grayscale images at the moment'
                img = toGray(img)
            
            item = ImageItem(img)

            #link colorbar
            fn1 = lambda hist, i=item: i.setLookupTable(hist.getLookupTable)  
            fn2 = lambda hist, i=item: i.setLevels(hist.region.getRegion() ) 
            hist.sigLookupTableChanged.connect(fn1)
            hist.sigLevelsChanged.connect(fn2)

            s0,s1 = img.shape[:2]
            item.moveBy(px,py)
            vb.addItem(item)
            #update grid position coords:
            ir += 1
            px += s0+s
            if ir == nr:
                ir = 0
                px = 0
                py += s1+s        
        
            self._items.append(item)
            self._fns.append((fn1,fn2))

        hist.sigLookupTableChanged.emit(hist)
        hist.sigLevelsChanged.emit(hist)

        ar = vb.state['autoRange']
        vb.state['autoRange'] = [True,True]
        vb.updateAutoRange()
        vb.state['autoRange'] = ar
Beispiel #6
0
 def _toggleGray(self, forceGray=False):
     if forceGray or self.image.ndim == 3:
         img = toGray(self.img)
         self.setImage(img)
         if self.img.ndim > 2:
             self.btn.setText('RGB')
         else:
             self.btn.hide()
         self.ui.histogram.show()
     else:
         self.setImage(self.img)
         self.btn.setText('Gray')
         self.ui.histogram.hide()
    def activate(self):

        self._items = []
        self._fns = []

        w = self.display.widget
        vb = w.view.vb

        if len(w.image) < 2:
            self.setChecked(False)
            raise Exception('needs multiple images for grid view')

        w.setCurrentIndex(0)
        w.display.widget.showTimeline(False)

        hist = w.ui.histogram

        for img, (px, py) in zip(w.image[1:], self._positions()):

            if isColor(img):
                # TODO: I dont know why it returns an error on color ...find
                # out
                print('only works on grayscale images at the moment')
                img = toGray(img)

            item = ImageItem(img)

            # link colorbar
            fn1 = lambda hist, i=item: i.setLookupTable(hist.getLookupTable)
            fn2 = lambda hist, i=item: i.setLevels(hist.region.getRegion())
            hist.sigLookupTableChanged.connect(fn1)
            hist.sigLevelsChanged.connect(fn2)

#             s0,s1 = img.shape[:2]
            item.moveBy(px, py)
            vb.addItem(item)

            self._items.append(item)
            self._fns.append((fn1, fn2))

        hist.sigLookupTableChanged.emit(hist)
        hist.sigLevelsChanged.emit(hist)

        ar = vb.state['autoRange']
        vb.state['autoRange'] = [True, True]
        vb.updateAutoRange()
        vb.state['autoRange'] = ar
Beispiel #8
0
    def activate(self):

        self._fns = []

        w = self.display.widget
        vb = w.view.vb

        w.subitems = []

        if len(w.image) < 2:
            self.setChecked(False)
            raise Exception('needs multiple images for grid view')

        w.setCurrentIndex(0)
        w.display.widget.showTimeline(False)

        hist = w.ui.histogram
        for img, (px, py) in zip(w.image[1:], self._positions()):
            if isColor(img):
                # TODO: I dont know why it returns an error on color ...find
                # out
                print('only works on grayscale images at the moment')
                img = toGray(img)

            item = ImageItem(img)

            # link colorbar
            fn1 = lambda hist, i=item: i.setLookupTable(hist.getLookupTable)
            fn2 = lambda hist, i=item: i.setLevels(hist.region.getRegion())
            hist.sigLookupTableChanged.connect(fn1)
            hist.sigLevelsChanged.connect(fn2)

            #             s0,s1 = img.shape[:2]
            item.moveBy(px, py)
            vb.addItem(item)

            w.subitems.append(item)
            self._fns.append((fn1, fn2))

        hist.sigLookupTableChanged.emit(hist)
        hist.sigLevelsChanged.emit(hist)

        ar = vb.state['autoRange']
        vb.state['autoRange'] = [True, True]
        vb.updateAutoRange()
        vb.state['autoRange'] = ar
Beispiel #9
0
def imread(img, color=None, dtype=None):
    '''
    dtype = 'noUint', uint8, float, 'float', ...
    '''
    COLOR2CV = {
        'gray': cv2.IMREAD_GRAYSCALE,
        'all': cv2.IMREAD_COLOR,
        None: cv2.IMREAD_ANYCOLOR
    }
    c = COLOR2CV[color]
    if callable(img):
        img = img()
    elif isinstance(img, str):  # string_types):
        #         from_file = True
        #         try:
        #             ftype = img[img.find('.'):]
        #             img = READERS[ftype](img)[0]
        #         except KeyError:
        # open with openCV
        # grey - 8 bit
        if dtype in (None, "noUint") or np.dtype(dtype) != np.uint8:
            c |= cv2.IMREAD_ANYDEPTH
        img2 = cv2.imread(img, c)
        if img2 is None:
            if os.path.exists(img):
                raise IOError("image '%s' cannot be read" % img)
            raise IOError("image '%s' is not existing" % img)
        img = img2

    elif color == 'gray' and img.ndim == 3:  # multi channel img like rgb
        # cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #cannot handle float64
        img = toGray(img)
    # transform array to uint8 array due to openCV restriction
    if dtype is not None:
        if isinstance(img, np.ndarray):
            img = _changeArrayDType(img, dtype, cutHigh=False)

    return img
def flatFieldFromCloseDistance(imgs, bg_imgs=None):
    '''
    Average multiple images of a homogeneous device
    imaged directly in front the camera lens.

    if [bg_imgs] are not given, background level is extracted
        from 1% of the cumulative intensity distribution
        of the averaged [imgs]

    This measurement method is referred as 'Method A' in
    ---
    K.Bedrich, M.Bokalic et al.:
    ELECTROLUMINESCENCE IMAGING OF PV DEVICES:
    ADVANCED FLAT FIELD CALIBRATION,2017
    ---
    '''
    img = imgAverage(imgs)
    bg = getBackground2(bg_imgs, img)
    img -= bg
    img = toGray(img)
    mx = median_filter(img[::10, ::10], 3).max()
    img /= mx
    return img
Beispiel #11
0
 def deactivate(self):
     d = self.display
     w = d.widget
     d.backupChangedLayer(backup=w.image, changes='RGB->gray')
     w.setImage(toGray(w.image))
Beispiel #12
0
 def deactivate(self):
     w = self.display.widget
     w.setImage(toGray(w.image))
Beispiel #13
0
 def deactivate(self):
     w = self.display.widget
     w.setImage(toGray(w.image))