def createLabelLayer(self, direct=False): """ Return a colortable layer that displays the label slot data, along with its associated label source. direct: whether this layer is drawn synchronously by volumina """ labelOutput = self._labelingSlots.labelOutput if not labelOutput.ready(): return (None, None) else: # Add the layer to draw the labels, but don't add any labels labelsrc = LazyflowSinkSource(self._labelingSlots.labelOutput, self._labelingSlots.labelInput) labellayer = ColortableLayer(labelsrc, colorTable=self._colorTable16, direct=direct) labellayer.name = "Labels" labellayer.ref_object = None labellayer.contexts.append( ("Import...", partial(import_labeling_layer, labellayer, self._labelingSlots, self))) return labellayer, labelsrc
def createLabelLayer(self, direct=False): """ Return a colortable layer that displays the label slot data, along with its associated label source. direct: whether this layer is drawn synchronously by volumina """ labelOutput = self._labelingSlots.labelOutput if not labelOutput.ready(): return (None, None) else: # Add the layer to draw the labels, but don't add any labels labelsrc = LazyflowSinkSource(self._labelingSlots.labelOutput, self._labelingSlots.labelInput) labellayer = ColortableLayer(labelsrc, colorTable=self._colorTable16, direct=direct) labellayer.name = "Labels" labellayer.ref_object = None labellayer.contexts.append( QAction("Import...", None, triggered=partial(import_labeling_layer, labellayer, self._labelingSlots, self))) labellayer.shortcutRegistration = ("0", ShortcutManager.ActionInfo( "Labeling", "LabelVisibility", "Show/Hide Labels", labellayer.toggleVisible, self.viewerControlWidget(), labellayer)) return labellayer, labelsrc
def createLabelLayer(self, direct=False): """Return a colortable layer that displays the label slot data, along with its associated label source. direct: whether this layer is drawn synchronously by volumina """ labelInput = self._labelingSlots.labelInput labelOutput = self._labelingSlots.labelOutput if not labelOutput.ready(): return (None, None) else: self._colorTable16[15] = QColor(Qt.black).rgba() #for the objects with NaNs in features labelsrc = LazyflowSinkSource(labelOutput, labelInput) labellayer = ColortableLayer(labelsrc, colorTable=self._colorTable16, direct=direct) labellayer.segmentationImageSlot = self.op.SegmentationImagesOut labellayer.name = "Labels" labellayer.ref_object = None labellayer.zeroIsTransparent = False labellayer.colortableIsRandom = True clickInt = ClickInterpreter(self.editor, labellayer, self.onClick, right=False, double=False) self.editor.brushingInterpreter = clickInt return labellayer, labelsrc
def createLabelLayer(self, direct=False): """Return a colortable layer that displays the label slot data, along with its associated label source. direct: whether this layer is drawn synchronously by volumina """ labelInput = self._labelingSlots.labelInput labelOutput = self._labelingSlots.labelOutput if not labelOutput.ready(): return (None, None) else: self._colorTable16[15] = QColor( Qt.black).rgba() #for the objects with NaNs in features labelsrc = LazyflowSinkSource(labelOutput, labelInput) labellayer = ColortableLayer(labelsrc, colorTable=self._colorTable16, direct=direct) labellayer.segmentationImageSlot = self.op.SegmentationImagesOut labellayer.name = "Labels" labellayer.ref_object = None labellayer.zeroIsTransparent = False labellayer.colortableIsRandom = True clickInt = ClickInterpreter(self.editor, labellayer, self.onClick, right=False, double=False) self.editor.brushingInterpreter = clickInt return labellayer, labelsrc
def createLabelLayer(self, direct=False): """ Return a colortable layer that displays the label slot data, along with its associated label source. direct: whether this layer is drawn synchronously by volumina """ labelOutput = self._labelingSlots.labelOutput if not labelOutput.ready(): return (None, None) else: # Add the layer to draw the labels, but don't add any labels labelsrc = LazyflowSinkSource( self._labelingSlots.labelOutput, self._labelingSlots.labelInput) labellayer = ColortableLayer(labelsrc, colorTable = self._colorTable16, direct=direct) labellayer.name = "Labels" labellayer.ref_object = None labellayer.contexts.append(QAction("Import...", None, triggered=partial(import_labeling_layer, labellayer, self._labelingSlots, self))) labellayer.shortcutRegistration = ("0", ShortcutManager.ActionInfo( "Labeling", "LabelVisibility", "Show/Hide Labels", labellayer.toggleVisible, self.viewerControlWidget(), labellayer)) return labellayer, labelsrc
def createLabelLayer(self, direct=False): """ Return a colortable layer that displays the label slot data, along with its associated label source. direct: whether this layer is drawn synchronously by volumina """ labelOutput = self._labelingSlots.labelOutput if not labelOutput.ready(): return (None, None) else: traceLogger.debug("Setting up labels") # Add the layer to draw the labels, but don't add any labels labelsrc = LazyflowSinkSource(self._labelingSlots.labelOutput, self._labelingSlots.labelInput) labellayer = ColortableLayer(labelsrc, colorTable=self._colorTable16, direct=direct) labellayer.name = "Labels" labellayer.ref_object = None return labellayer, labelsrc
def createCropLayer(self, direct=False): """ Return a colortable layer that displays the crop slot data, along with its associated crop source. direct: whether this layer is drawn synchronously by volumina """ cropOutput = self._croppingSlots.cropOutput if not cropOutput.ready(): return (None, None) else: # Add the layer to draw the crops, but don't add any crops cropsrc = LazyflowSinkSource( self._croppingSlots.cropOutput, self._croppingSlots.cropInput) croplayer = ColortableLayer(cropsrc, colorTable = self._colorTable16, direct=direct ) croplayer.name = "Crops" croplayer.ref_object = None return croplayer, cropsrc
def createLabelLayer(self, direct=False): """ Return a colortable layer that displays the label slot data, along with its associated label source. direct: whether this layer is drawn synchronously by volumina """ labelOutput = self._labelingSlots.labelOutput if not labelOutput.ready(): return (None, None) else: # Add the layer to draw the labels, but don't add any labels labelsrc = LazyflowSinkSource( self._labelingSlots.labelOutput, self._labelingSlots.labelInput) labellayer = ColortableLayer(labelsrc, colorTable = self._colorTable16, direct=direct ) labellayer.name = "Labels" labellayer.ref_object = None labellayer.contexts.append(("Import...", partial( import_labeling_layer, labellayer, self._labelingSlots, self ))) return labellayer, labelsrc
def createLabelLayer(self, currentImageIndex, direct=False): """ Return a colortable layer that displays the label slot data, along with its associated label source. direct: whether this layer is drawn synchronously by volumina """ labelOutput = self._labelingSlots.labelOutput[currentImageIndex] if not labelOutput.ready(): return (None, None) else: traceLogger.debug("Setting up labels for image index={}".format( currentImageIndex)) # Add the layer to draw the labels, but don't add any labels labelsrc = LazyflowSinkSource( self._labelingSlots.labelOutput[currentImageIndex], self._labelingSlots.labelInput[currentImageIndex]) labellayer = ColortableLayer(labelsrc, colorTable=self._colorTable16, direct=direct) labellayer.name = "Labels" labellayer.ref_object = None return labellayer, labelsrc
def setupLayers(self): # Base class provides the label layer. layers = super(ObjectClassificationGui, self).setupLayers() binarySlot = self.op.BinaryImages segmentedSlot = self.op.SegmentationImages rawSlot = self.op.RawImages #This is just for colors labels = self.labelListData for channel, probSlot in enumerate(self.op.PredictionProbabilityChannels): if probSlot.ready() and channel < len(labels): ref_label = labels[channel] probsrc = LazyflowSource(probSlot) probLayer = AlphaModulatedLayer( probsrc, tintColor=ref_label.pmapColor(), range=(0.0, 1.0), normalize=(0.0, 1.0) ) probLayer.opacity = 0.25 #probLayer.visible = self.labelingDrawerUi.checkInteractive.isChecked() #False, because it's much faster to draw predictions without these layers below probLayer.visible = False probLayer.setToolTip("Probability that the object belongs to class {}".format(channel+1)) def setLayerColor(c, predictLayer_=probLayer, ch=channel, initializing=False): if not initializing and predictLayer_ not in self.layerstack: # This layer has been removed from the layerstack already. # Don't touch it. return predictLayer_.tintColor = c def setLayerName(n, predictLayer_=probLayer, initializing=False): if not initializing and predictLayer_ not in self.layerstack: # This layer has been removed from the layerstack already. # Don't touch it. return newName = "Prediction for %s" % n predictLayer_.name = newName setLayerName(ref_label.name, initializing=True) ref_label.pmapColorChanged.connect(setLayerColor) ref_label.nameChanged.connect(setLayerName) layers.append(probLayer) predictionSlot = self.op.PredictionImages if predictionSlot.ready(): predictsrc = LazyflowSource(predictionSlot) self._colorTable16_forpmaps[0] = 0 predictLayer = ColortableLayer(predictsrc, colorTable=self._colorTable16_forpmaps) predictLayer.name = self.PREDICTION_LAYER_NAME predictLayer.ref_object = None predictLayer.visible = self.labelingDrawerUi.checkInteractive.isChecked() predictLayer.opacity = 0.5 predictLayer.setToolTip("Classification results, assigning a label to each object") # This weakref stuff is a little more fancy than strictly necessary. # The idea is to use the weakref's callback to determine when this layer instance is destroyed by the garbage collector, # and then we disconnect the signal that updates that layer. weak_predictLayer = weakref.ref( predictLayer ) colortable_changed_callback = bind( self._setPredictionColorTable, weak_predictLayer ) self._labelControlUi.labelListModel.dataChanged.connect( colortable_changed_callback ) weak_predictLayer2 = weakref.ref( predictLayer, partial(self._disconnect_dataChange_callback, colortable_changed_callback) ) # We have to make sure the weakref isn't destroyed because it is responsible for calling the callback. # Therefore, we retain it by adding it to a list. self._retained_weakrefs.append( weak_predictLayer2 ) # Ensure we're up-to-date (in case this is the first time the prediction layer is being added. for row in range( self._labelControlUi.labelListModel.rowCount() ): self._setPredictionColorTableForRow( predictLayer, row ) # put right after Labels, so that it is visible after hitting "live # predict". layers.insert(1, predictLayer) badObjectsSlot = self.op.BadObjectImages if badObjectsSlot.ready(): ct_black = [0, QColor(Qt.black).rgba()] badSrc = LazyflowSource(badObjectsSlot) badLayer = ColortableLayer(badSrc, colorTable = ct_black) badLayer.name = "Ambiguous objects" badLayer.setToolTip("Objects with infinite or invalid values in features") badLayer.visible = False layers.append(badLayer) if segmentedSlot.ready(): ct = colortables.create_default_16bit() objectssrc = LazyflowSource(segmentedSlot) ct[0] = QColor(0, 0, 0, 0).rgba() # make 0 transparent objLayer = ColortableLayer(objectssrc, ct) objLayer.name = "Objects" objLayer.opacity = 0.5 objLayer.visible = False objLayer.setToolTip("Segmented objects (labeled image/connected components)") layers.append(objLayer) if binarySlot.ready(): ct_binary = [0, QColor(255, 255, 255, 255).rgba()] # white foreground on transparent background, even for labeled images binct = [QColor(255, 255, 255, 255).rgba()]*65536 binct[0] = 0 binaryimagesrc = LazyflowSource(binarySlot) binLayer = ColortableLayer(binaryimagesrc, binct) binLayer.name = "Binary image" binLayer.visible = True binLayer.opacity = 1.0 binLayer.setToolTip("Segmentation results as a binary mask") layers.append(binLayer) if rawSlot.ready(): rawLayer = self.createStandardLayerFromSlot(rawSlot) rawLayer.name = "Raw data" def toggleTopToBottom(): index = self.layerstack.layerIndex( rawLayer ) self.layerstack.selectRow( index ) if index == 0: self.layerstack.moveSelectedToBottom() else: self.layerstack.moveSelectedToTop() ActionInfo = ShortcutManager.ActionInfo rawLayer.shortcutRegistration = ( "i", ActionInfo( "Prediction Layers", "Bring Input To Top/Bottom", "Bring Input To Top/Bottom", toggleTopToBottom, self.viewerControlWidget(), rawLayer ) ) layers.append(rawLayer) # since we start with existing labels, it makes sense to start # with the first one selected. This would make more sense in # __init__(), but it does not take effect there. #self.selectLabel(0) return layers
def setupLayers(self): # Base class provides the label layer and the raw layer layers = super(ObjectClassificationGui, self).setupLayers() binarySlot = self.op.BinaryImages atlas_slot = self.op.Atlas segmentedSlot = self.op.SegmentationImages #This is just for colors labels = self.labelListData for channel, probSlot in enumerate( self.op.PredictionProbabilityChannels): if probSlot.ready() and channel < len(labels): ref_label = labels[channel] probsrc = LazyflowSource(probSlot) probLayer = AlphaModulatedLayer( probsrc, tintColor=ref_label.pmapColor(), range=(0.0, 1.0), normalize=(0.0, 1.0)) probLayer.opacity = 0.25 #probLayer.visible = self.labelingDrawerUi.checkInteractive.isChecked() #False, because it's much faster to draw predictions without these layers below probLayer.visible = False probLayer.setToolTip( "Probability that the object belongs to class {}".format( channel + 1)) def setLayerColor(c, predictLayer_=probLayer, ch=channel, initializing=False): if not initializing and predictLayer_ not in self.layerstack: # This layer has been removed from the layerstack already. # Don't touch it. return predictLayer_.tintColor = c def setLayerName(n, predictLayer_=probLayer, initializing=False): if not initializing and predictLayer_ not in self.layerstack: # This layer has been removed from the layerstack already. # Don't touch it. return newName = "Prediction for %s" % n predictLayer_.name = newName setLayerName(ref_label.name, initializing=True) ref_label.pmapColorChanged.connect(setLayerColor) ref_label.nameChanged.connect(setLayerName) layers.append(probLayer) predictionSlot = self.op.PredictionImages if predictionSlot.ready(): predictsrc = LazyflowSource(predictionSlot) self._colorTable16_forpmaps[0] = 0 predictLayer = ColortableLayer( predictsrc, colorTable=self._colorTable16_forpmaps) predictLayer.name = self.PREDICTION_LAYER_NAME predictLayer.ref_object = None predictLayer.opacity = 0.5 predictLayer.setToolTip( "Classification results, assigning a label to each object") # This weakref stuff is a little more fancy than strictly necessary. # The idea is to use the weakref's callback to determine when this layer instance is destroyed by the garbage collector, # and then we disconnect the signal that updates that layer. weak_predictLayer = weakref.ref(predictLayer) colortable_changed_callback = bind(self._setPredictionColorTable, weak_predictLayer) self._labelControlUi.labelListModel.dataChanged.connect( colortable_changed_callback) weak_predictLayer2 = weakref.ref( predictLayer, partial(self._disconnect_dataChange_callback, colortable_changed_callback)) # We have to make sure the weakref isn't destroyed because it is responsible for calling the callback. # Therefore, we retain it by adding it to a list. self._retained_weakrefs.append(weak_predictLayer2) # Ensure we're up-to-date (in case this is the first time the prediction layer is being added. for row in range(self._labelControlUi.labelListModel.rowCount()): self._setPredictionColorTableForRow(predictLayer, row) # put right after Labels, so that it is visible after hitting "live # predict". layers.insert(1, predictLayer) badObjectsSlot = self.op.BadObjectImages if badObjectsSlot.ready(): ct_black = [0, QColor(Qt.black).rgba()] badSrc = LazyflowSource(badObjectsSlot) badLayer = ColortableLayer(badSrc, colorTable=ct_black) badLayer.name = "Ambiguous objects" badLayer.setToolTip( "Objects with infinite or invalid values in features") badLayer.visible = False layers.append(badLayer) if segmentedSlot.ready(): ct = colortables.create_default_16bit() objectssrc = LazyflowSource(segmentedSlot) ct[0] = QColor(0, 0, 0, 0).rgba() # make 0 transparent objLayer = ColortableLayer(objectssrc, ct) objLayer.name = "Objects" objLayer.opacity = 0.5 objLayer.visible = False objLayer.setToolTip( "Segmented objects (labeled image/connected components)") layers.append(objLayer) uncertaintySlot = self.op.UncertaintyEstimateImage if uncertaintySlot.ready(): uncertaintySrc = LazyflowSource(uncertaintySlot) uncertaintyLayer = AlphaModulatedLayer(uncertaintySrc, tintColor=QColor(Qt.cyan), range=(0.0, 1.0), normalize=(0.0, 1.0)) uncertaintyLayer.name = "Uncertainty" uncertaintyLayer.visible = False uncertaintyLayer.opacity = 1.0 ActionInfo = ShortcutManager.ActionInfo uncertaintyLayer.shortcutRegistration = ( "u", ActionInfo("Uncertainty Layers", "Uncertainty", "Show/Hide Uncertainty", uncertaintyLayer.toggleVisible, self.viewerControlWidget(), uncertaintyLayer)) layers.append(uncertaintyLayer) if binarySlot.ready(): ct_binary = [0, QColor(255, 255, 255, 255).rgba()] # white foreground on transparent background, even for labeled images binct = [QColor(255, 255, 255, 255).rgba()] * 65536 binct[0] = 0 binaryimagesrc = LazyflowSource(binarySlot) binLayer = ColortableLayer(binaryimagesrc, binct) binLayer.name = "Binary image" binLayer.visible = True binLayer.opacity = 1.0 binLayer.setToolTip("Segmentation results as a binary mask") layers.append(binLayer) if atlas_slot.ready(): layers.append( self.createStandardLayerFromSlot(atlas_slot, name="Atlas", opacity=0.5)) # since we start with existing labels, it makes sense to start # with the first one selected. This would make more sense in # __init__(), but it does not take effect there. #self.selectLabel(0) return layers