Search in sources :

Example 1 with IJLog

use of mcib3d.utils.Logger.IJLog in project mcib3d-core by mcib3d.

the class TrackThreshold method process.

private ArrayList<ObjectTrack> process(ImageHandler img) {
    switch(criteria_method) {
        case CRITERIA_METHOD_MIN_ELONGATION:
            criterion = new CriterionElongation();
            bestCriterion = new BestCriteriaMin();
            break;
        case CRITERIA_METHOD_MAX_COMPACTNESS:
            criterion = new CriterionCompactness();
            bestCriterion = new BestCriteriaMax();
            break;
        case CRITERIA_METHOD_MAX_VOLUME:
            criterion = new CriterionVolume();
            bestCriterion = new BestCriteriaMax();
            break;
        case CRITERIA_METHOD_MSER:
            criterion = new CriterionVolume();
            bestCriterion = new BestCriteriaStable();
            break;
        case CRITERIA_METHOD_MAX_EDGES:
            criterion = new CriterionEdge(img, 0.5);
            bestCriterion = new BestCriteriaMax();
            break;
        case CRITERIA_METHOD_MAX_CLASSIFICATION:
            // test
            criterion = new CriterionClassification("/home/thomasb/App/ImageJ/testWEKA.arff");
            bestCriterion = new BestCriteriaMax();
            break;
        default:
            // MSER
            criterion = new CriterionVolume();
            bestCriterion = new BestCriteriaStable();
            break;
    }
    int T0, TMaximum, T1;
    int[] histogramThreshold;
    ImageLabeller labeler = new ImageLabeller(volMin, volMax);
    TMaximum = (int) img.getMax();
    if (log != null)
        log.log("Analysing histogram ...");
    histogramThreshold = initHistogram(img);
    if (histogramThreshold.length == 0)
        return null;
    T0 = histogramThreshold[0];
    // first frame
    T1 = T0;
    if (log != null)
        log.log("Computing frame for first threshold " + T1);
    ArrayList<ObjectTrack> frame1 = computeFrame(img, labeler.getObjects(img.thresholdAboveInclusive(T1)), markers, T1, criterion);
    if (log != null)
        log.log("Starting iterative thresholding ... ");
    ArrayList<ObjectTrack> allFrames = new ArrayList<ObjectTrack>();
    allFrames.addAll(frame1);
    // use histogram and unique values to loop over pixel values
    GlobalThreshold = 0;
    // 
    Chrono chrono = new Chrono(TMaximum);
    chrono.start();
    String S = null;
    if (log instanceof IJLog) {
        // was true
        ((IJLog) (log)).setUpdate(true);
    }
    // / LOOP
    while (T1 <= TMaximum) {
        int T2 = computeNextThreshold(T1, TMaximum, histogramThreshold);
        // IJ.log("" + T1 + " " + T2 + " " + TMaximum);
        if (T2 < 0)
            break;
        if (log != null) {
            S = chrono.getFullInfo(T2 - T1);
            // IJ.log("\\Update: "+S);
            if (S != null)
                log.log("task " + S);
        }
        // if (status) IJ.showStatus("Computing frame for threshold " + T2 + "                   ");
        // Threshold T2
        ImageHandler bin2 = img.thresholdAboveInclusive(T2);
        ImageHandler labels2 = labeler.getLabels(bin2);
        ArrayList<ObjectTrack> frame2 = computeFrame(img, labeler.getObjects(bin2), markers, T2, criterion);
        System.gc();
        // T2--> new T1
        T1 = T2;
        frame1 = computeAssociation(frame1, frame2, allFrames, labels2);
    }
    // thresholding
    if (log instanceof IJLog) {
        ((IJLog) (log)).setUpdate(false);
    }
    if (log != null) {
        log.log("Iterative Thresholding finished");
    }
    return allFrames;
// return computeResults(allFrames, img, bestCriterion);
}
Also used : Chrono(mcib3d.utils.Chrono) IJLog(mcib3d.utils.Logger.IJLog) ArrayList(java.util.ArrayList)

Example 2 with IJLog

use of mcib3d.utils.Logger.IJLog in project mcib3d-core by mcib3d.

the class Watershed3D method processWatershed.

private void processWatershed() {
    long step = 100;
    createNeigList();
    long t0 = System.currentTimeMillis();
    if (anim) {
        watershedImage.show();
    }
    if (rawImage.getMin() > rawThreshold) {
        log.log("Setting minimum for raw image to " + rawImage.getMin());
        rawThreshold = rawImage.getMin();
    }
    // tree set
    ComparatorVoxel comp = new ComparatorVoxel();
    TreeSet<Voxel3DComparable> tree = new TreeSet<Voxel3DComparable>(comp);
    int idx = 1;
    for (Voxel3DComparable V : voxels) {
        V.setMax(idx, 0);
        idx++;
        tree.add(V);
    }
    boolean newt = true;
    log.log("");
    if (log instanceof IJLog)
        ((IJLog) (log)).setUpdate(true);
    while (newt) {
        newt = false;
        while (!tree.isEmpty()) {
            Voxel3DComparable V = tree.pollFirst();
            ArrayList<Voxel3D> Nei = watershedImage.getNeighborhood3x3x3ListNoCenter(V.getRoundX(), V.getRoundY(), V.getRoundZ());
            // if in DAM, do not process
            if (watershedImage.getPixel(V) == DAM)
                continue;
            watershedImage.setPixel(V, labelQueueImage.getPixel(V));
            // all free voxels around are put into queue
            for (Voxel3D N : Nei) {
                float rawN = rawImage.getPixel(N);
                if (rawN > rawThreshold) {
                    // neighbor voxel not in queue yet
                    if ((N.getValue() == 0)) {
                        watershedImage.setPixel(N, QUEUE);
                        labelQueueImage.setPixel(N, (int) V.getLabel());
                        Voxel3DComparable Vnew = new Voxel3DComparable(N.getRoundX(), N.getRoundY(), N.getRoundZ(), rawN, V.getLabel());
                        Vnew.setMax(idx, 0);
                        idx++;
                        tree.add(Vnew);
                    } else // neighbor was already in Q by another label --> dam !
                    if ((N.getValue() == QUEUE) && (labelQueueImage.getPixel(V) != labelQueueImage.getPixel(N))) {
                        watershedImage.setPixel(N, DAM);
                    }
                }
            }
            if (System.currentTimeMillis() - t0 > step) {
                log.log("Voxels to process : " + Math.abs(tree.size()));
                if (anim) {
                    watershedImage.updateDisplay();
                }
                t0 = System.currentTimeMillis();
            }
        }
    }
    log.log("Voxels to process : " + Math.abs(tree.size()));
    if (log instanceof IJLog)
        ((IJLog) (log)).setUpdate(false);
    log.log("Watershed completed.");
    damImage = (ImageInt) watershedImage.createSameDimensions();
    watershedImage.transfertPixelValues(damImage, 1, 255);
    // replace dam values with 0
    watershedImage.replacePixelsValue(1, 0);
    // back to original seeds value
    for (int val : seedsValue.keySet()) {
        watershedImage.replacePixelsValue(val, seedsValue.get(val));
    }
}
Also used : IJLog(mcib3d.utils.Logger.IJLog) ComparatorVoxel(mcib3d.geom.ComparatorVoxel) Voxel3D(mcib3d.geom.Voxel3D) Voxel3DComparable(mcib3d.geom.Voxel3DComparable)

Aggregations

IJLog (mcib3d.utils.Logger.IJLog)2 ArrayList (java.util.ArrayList)1 ComparatorVoxel (mcib3d.geom.ComparatorVoxel)1 Voxel3D (mcib3d.geom.Voxel3D)1 Voxel3DComparable (mcib3d.geom.Voxel3DComparable)1 Chrono (mcib3d.utils.Chrono)1