SegmentList WaterShedDecomposer::decompose(ImageColor const & image) const { QTime time; time.start(); // original image image.save("WS1_original.png"); // filter image time.restart(); ImageColor filtered = filterGauss(image, radiusGauss->value()); qDebug("Image filtered in %g seconds", time.restart()/1000.0); filtered.save("WS2_filtered.png"); // calculate gradient magnitude map time.restart(); ImageGray gradientMap = gradientMagnitude(filtered); qDebug("Gradient magnitude map calculated in %g seconds", time.restart()/1000.0); gradientMap.save("WS3_gradient.png"); // apply watershed transformation time.restart(); SegmentList segments = watershed(gradientMap, image); qDebug("Watershed transformation applied in %g seconds", time.restart()/1000.0); qDebug(" Segments: %d", segments.size()); ImageColor debugOut(image.width(), image.height()); segments.copyToImageAVG(debugOut); debugOut.save("WS4_transformed.png"); // merge similiar and small segments time.restart(); int oldSegmentsSize; do { oldSegmentsSize = segments.size(); mergeSimiliarSegments(segments, epsilonMerge->value()*epsilonMerge->value()); mergeSmallSegments(segments, minSize->value()); } while (segments.size() != oldSegmentsSize); qDebug("Segments merged in %g seconds", time.restart()/1000.0); qDebug(" Segments: %d", segments.size()); segments.copyToImageAVG(debugOut); debugOut.save("WS5_merged.png"); return segments; }