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
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
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
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
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
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
def deactivate(self): d = self.display w = d.widget d.backupChangedLayer(backup=w.image, changes='RGB->gray') w.setImage(toGray(w.image))
def deactivate(self): w = self.display.widget w.setImage(toGray(w.image))