!7 cmodule ImageSegmenter > DynImageSurface { float contrastThreshold = 0.5f; int gridSize = 2; transient ReliableSingleThread rst = dm_rst(this, r segmentIt); visualize { JSlider slider = jLiveValueSlider(dm_fieldLiveValue('contrastThreshold)); main.onChange(slider, rst); JSpinner spinner = liveValueSpinner(dm_fieldLiveValue('gridSize), 2, 10); main.onChange(spinner, rst); ret withCenteredLineBelow(super.visualize(), withLabel("Contrast Threshold:", slider), withLabel("Grid size:", spinner), jbutton("Segment", rst)); } start { if (!hasImage()) setImage(whiteImage(100, 100)); dm_vmBus_onMessage('newClipboardContents, voidfunc(O o) { if (o cast BufferedImage) thread { setImage(o); rst.trigger(); } }); } void segmentIt enter { if (!hasImage()) ret; new AutoSegmenter as; as.g = gridSize; as.contrastThreshold = contrastThreshold; overlaySelectionsOnImageSurface(imageSurface, as.go(BWImage(getImage()))); } }