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);
}
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));
}
}
Aggregations