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 _create_random_colortable_layer_from_slot(cls, slot, num_colors=256): colortable = generateRandomColors(num_colors, clamp={ 'v': 1.0, 's': 0.5 }, zeroIsTransparent=True) layer = ColortableLayer(LazyflowSource(slot), colortable) layer.colortableIsRandom = True return layer
def _initColortableLayer(self, labelSlot): objectssrc = createDataSource(labelSlot) objectssrc.setObjectName("LabelImage LazyflowSrc") ct = colortables.create_default_16bit() ct[0] = QColor(0, 0, 0, 0).rgba() # make 0 transparent layer = ColortableLayer(objectssrc, ct) layer.name = "Object Identities - Preview" layer.setToolTip("Segmented objects, shown in different colors") layer.visible = False layer.opacity = 0.5 layer.colortableIsRandom = True return layer
def setupLayers(self): layers = [] op = self.topLevelOperatorView ct = create_default_16bit() ct[0] = 0 # Show the cached output, since it goes through a blocked cache if op.CachedOutput.ready(): outputSrc = createDataSource(op.CachedOutput) outputLayer = ColortableLayer(outputSrc, ct) outputLayer.name = "Final output" outputLayer.visible = False outputLayer.opacity = 1.0 outputLayer.colortableIsRandom = True outputLayer.setToolTip( "Object Identities: Results of thresholding, connected components and size filter" ) layers.append(outputLayer) if op.InputChannelColors.ready(): input_channel_colors = [ QColor(r_g_b1[0], r_g_b1[1], r_g_b1[2]) for r_g_b1 in op.InputChannelColors.value ] else: input_channel_colors = list( map(QColor, self._defaultInputChannelColors)) for channel, channelProvider in enumerate(self._channelProviders): slot_drange = channelProvider.Output.meta.drange if slot_drange is not None: drange = slot_drange else: drange = (0.0, 1.0) channelSrc = createDataSource(channelProvider.Output) inputChannelLayer = AlphaModulatedLayer( channelSrc, tintColor=input_channel_colors[channel], normalize=drange) inputChannelLayer.opacity = 0.5 inputChannelLayer.visible = True inputChannelLayer.name = "Input Channel " + str(channel) inputChannelLayer.setToolTip( "Select input channel " + str(channel) + " if this prediction image contains the objects of interest.") layers.append(inputChannelLayer) if self._showDebug: # FIXME: We have to do that, because lazyflow doesn't have a way to make an operator partially ready curIndex = op.CurOperator.value if curIndex in (1, 3): if op.FilteredSmallLabels.ready(): filteredSmallLabelsSrc = createDataSource( op.FilteredSmallLabels) # filteredSmallLabelsLayer = self.createStandardLayerFromSlot( op.FilteredSmallLabels ) filteredSmallLabelsLayer = ColortableLayer( filteredSmallLabelsSrc, DebugLayerCmap.BINARY_SHADE_1.value) filteredSmallLabelsLayer.name = "After high threshold and size filter" filteredSmallLabelsLayer.visible = False filteredSmallLabelsLayer.opacity = 1.0 filteredSmallLabelsLayer.setToolTip( "Results of thresholding with the high pixel value threshold,\ followed by the size filter" ) layers.append(filteredSmallLabelsLayer) if op.SmallRegions.ready(): highThresholdSrc = createDataSource(op.SmallRegions) highThresholdLayer = ColortableLayer( highThresholdSrc, DebugLayerCmap.BINARY_SHADE_0.value) highThresholdLayer.name = "After high threshold" highThresholdLayer.visible = False highThresholdLayer.opacity = 1.0 highThresholdLayer.setToolTip( "Results of thresholding with the high pixel value threshold" ) layers.append(highThresholdLayer) if op.BigRegions.ready(): lowThresholdSrc = createDataSource(op.BigRegions) lowThresholdLayer = ColortableLayer( lowThresholdSrc, DebugLayerCmap.BINARY_WHITE.value) lowThresholdLayer.name = "After low threshold" lowThresholdLayer.visible = False lowThresholdLayer.opacity = 1.0 lowThresholdLayer.setToolTip( "Results of thresholding with the low pixel value threshold" ) layers.append(lowThresholdLayer) elif curIndex == 0: if op.BeforeSizeFilter.ready(): thSrc = createDataSource(op.BeforeSizeFilter) thLayer = ColortableLayer( thSrc, DebugLayerCmap.BINARY_WHITE.value) thLayer.name = "Before size filter" thLayer.visible = False thLayer.opacity = 1.0 thLayer.setToolTip( "Results of thresholding before the size filter is applied" ) layers.append(thLayer) # Selected input channel, smoothed. if op.Smoothed.ready(): smoothedLayer = self.createStandardLayerFromSlot(op.Smoothed) smoothedLayer.name = "Smoothed input" smoothedLayer.visible = True smoothedLayer.opacity = 1.0 smoothedLayer.setToolTip( "Selected channel data, smoothed with a Gaussian with user-defined sigma" ) layers.append(smoothedLayer) # Show the raw input data rawSlot = self.topLevelOperatorView.RawInput if rawSlot.ready(): rawLayer = self.createStandardLayerFromSlot(rawSlot) rawLayer.name = "Raw data" rawLayer.visible = True rawLayer.opacity = 1.0 layers.append(rawLayer) return layers
def setupLayers(self): mainOperator = self.topLevelOperatorView layers = [] if mainOperator.ObjectCenterImage.ready(): self.centerimagesrc = createDataSource( mainOperator.ObjectCenterImage) redct = [0, QColor(255, 0, 0).rgba()] layer = ColortableLayer(self.centerimagesrc, redct) layer.name = "Object centers" layer.setToolTip( "Object center positions, marked with a little red cross") layer.visible = False layers.append(layer) ct = colortables.create_default_16bit() if mainOperator.LabelImage.ready(): self.objectssrc = createDataSource(mainOperator.LabelImage) self.objectssrc.setObjectName("LabelImage LazyflowSrc") ct[0] = QColor(0, 0, 0, 0).rgba() # make 0 transparent layer = ColortableLayer(self.objectssrc, ct) layer.name = "Object Identities" layer.setToolTip("Segmented objects, shown in different colors") layer.colortableIsRandom = True layer.visible = False layer.opacity = 0.5 layers.append(layer) # white foreground on transparent background, even for labeled images binct = [QColor(255, 255, 255, 255).rgba()] * 65536 binct[0] = 0 if mainOperator.BinaryImage.ready(): self.binaryimagesrc = createDataSource(mainOperator.BinaryImage) self.binaryimagesrc.setObjectName("Binary LazyflowSrc") layer = ColortableLayer(self.binaryimagesrc, binct) layer.name = "Binary image" layer.setToolTip("Segmented objects, binary mask") layers.append(layer) ## raw data layer self.rawsrc = None self.rawsrc = createDataSource(mainOperator.RawImage) self.rawsrc.setObjectName("Raw Lazyflow Src") layerraw = GrayscaleLayer(self.rawsrc) layerraw.name = "Raw data" layers.insert(len(layers), layerraw) mainOperator.RawImage.notifyReady(self._onReady) self.__cleanup_fns.append( partial(mainOperator.RawImage.unregisterReady, self._onReady)) mainOperator.RawImage.notifyMetaChanged(self._onMetaChanged) self.__cleanup_fns.append( partial(mainOperator.RawImage.unregisterMetaChanged, self._onMetaChanged)) mainOperator.BinaryImage.notifyMetaChanged(self._onMetaChanged) self.__cleanup_fns.append( partial(mainOperator.BinaryImage.unregisterMetaChanged, self._onMetaChanged)) 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 = createDataSource(probSlot) probLayer = AlphaModulatedLayer( probsrc, tintColor=ref_label.pmapColor(), 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 = createDataSource(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 = createDataSource(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 = createDataSource(segmentedSlot) ct[0] = QColor(0, 0, 0, 0).rgba() # make 0 transparent objLayer = ColortableLayer(objectssrc, ct) objLayer.name = "Object Identities" objLayer.opacity = 0.5 objLayer.visible = False objLayer.setToolTip("Segmented objects, shown in different colors") objLayer.colortableIsRandom = True layers.append(objLayer) uncertaintySlot = self.op.UncertaintyEstimateImage if uncertaintySlot.ready(): uncertaintySrc = createDataSource(uncertaintySlot) uncertaintyLayer = AlphaModulatedLayer(uncertaintySrc, tintColor=QColor(Qt.cyan), 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(): # white foreground on transparent background, even for labeled images binct = [QColor(255, 255, 255, 255).rgba()] * 65536 binct[0] = 0 binaryimagesrc = createDataSource(binarySlot) binLayer = ColortableLayer(binaryimagesrc, binct) binLayer.name = "Binary image" binLayer.visible = True binLayer.opacity = 1.0 binLayer.setToolTip("Segmented objects, 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
def _create_random_colortable_layer_from_slot(cls, slot, num_colors=256): colortable = generateRandomColors(num_colors, clamp={'v': 1.0, 's' : 0.5}, zeroIsTransparent=True) layer = ColortableLayer(LazyflowSource(slot), colortable) layer.colortableIsRandom = True return layer