use of mcib3d.utils.Chrono in project mcib3d-core by mcib3d.
the class FastFilters3D method filterFloatImage.
public static ImageFloat filterFloatImage(ImageFloat stackorig, int filter, float vx, float vy, float vz, int nbcpus, boolean showstatus) {
int nbToProcess = stackorig.sizeZ;
if ((filter == TOPHAT) || (filter == CLOSEGRAY) || (filter == OPENGRAY))
nbToProcess *= 2;
// Timer
final Chrono time = new Chrono(nbToProcess);
time.start();
final AbstractLog show = new IJStatus();
// get stack info
final float voisx = vx;
final float voisy = vy;
final float voisz = vz;
final ImageFloat ima = stackorig;
ImageFloat res = (ImageFloat) ima.createSameDimensions();
if ((filter == MEAN) || (filter == MEDIAN) || (filter == MIN) || (filter == MAX) || (filter == MAXLOCAL) || (filter == TOPHAT) || (filter == VARIANCE) || (filter == CLOSEGRAY) || (filter == OPENGRAY)) {
// PARALLEL
final ImageFloat out = res;
final AtomicInteger ai = new AtomicInteger(0);
final int n_cpus = nbcpus == 0 ? ThreadUtil.getNbCpus() : nbcpus;
int fi = filter;
if ((fi == TOPHAT) || (fi == OPENGRAY)) {
fi = MIN;
}
if (fi == CLOSEGRAY) {
fi = MAX;
}
final int f = fi;
final int dec = (int) Math.ceil((double) ima.sizeZ / (double) n_cpus);
Thread[] threads = ThreadUtil.createThreadArray(n_cpus);
for (int ithread = 0; ithread < threads.length; ithread++) {
threads[ithread] = new Thread() {
@Override
public void run() {
for (int k = ai.getAndIncrement(); k < n_cpus; k = ai.getAndIncrement()) {
ima.filterGeneric(out, voisx, voisy, voisz, dec * k, dec * (k + 1), f, time, show);
}
}
};
}
ThreadUtil.startAndJoin(threads);
// TOPHAT MAX
if ((filter == TOPHAT) || (filter == OPENGRAY)) {
final int f2 = MAX;
final ImageFloat res2 = (ImageFloat) ima.createSameDimensions();
ai.set(0);
for (int ithread = 0; ithread < threads.length; ithread++) {
threads[ithread] = new Thread() {
@Override
public void run() {
for (int k = ai.getAndIncrement(); k < n_cpus; k = ai.getAndIncrement()) {
out.filterGeneric(res2, voisx, voisy, voisz, dec * k, dec * (k + 1), f2, time, show);
}
}
};
}
ThreadUtil.startAndJoin(threads);
// TOPHAT DIFFERENCE
if (filter == TOPHAT) {
res = ima.subtractImage(res2);
} else {
res = res2;
}
}
// CLOSING 2nd Step
if (filter == CLOSEGRAY) {
final int f2 = MIN;
final ImageFloat res2 = (ImageFloat) ima.createSameDimensions();
ai.set(0);
for (int ithread = 0; ithread < threads.length; ithread++) {
threads[ithread] = new Thread() {
@Override
public void run() {
for (int k = ai.getAndIncrement(); k < n_cpus; k = ai.getAndIncrement()) {
out.filterGeneric(res2, voisx, voisy, voisz, dec * k, dec * (k + 1), f2, time, show);
}
}
};
}
ThreadUtil.startAndJoin(threads);
res = res2;
}
} else if (filter == SOBEL) {
res = ima.sobelFilter();
} else if (filter == ADAPTIVE) {
// res = ima.adaptiveFilter(voisx, voisy, voisz, nbcpus);
// PARALLEL
final ImageFloat out = res;
final AtomicInteger ai = new AtomicInteger(0);
final int n_cpus = nbcpus == 0 ? ThreadUtil.getNbCpus() : nbcpus;
final int dec = (int) Math.ceil((double) ima.sizeZ / (double) n_cpus);
Thread[] threads = ThreadUtil.createThreadArray(n_cpus);
show.log("Starting");
for (int ithread = 0; ithread < threads.length; ithread++) {
threads[ithread] = new Thread() {
@Override
public void run() {
for (int k = ai.getAndIncrement(); k < n_cpus; k = ai.getAndIncrement()) {
ima.adaptiveFilter(out, voisx, voisy, voisz, dec * k, dec * (k + 1), time, show);
}
}
};
}
ThreadUtil.startAndJoin(threads);
show.log("Finished");
}
return res;
}
use of mcib3d.utils.Chrono in project mcib3d-core by mcib3d.
the class FastFilters3D method getListMaximaInt.
public static ArrayList<Voxel3DComparable> getListMaximaInt(ImageInt stackorig, float vx, float vy, float vz, int nbcpus, boolean showstatus) {
int nbToProcess = stackorig.sizeZ;
// Timer
final Chrono time = new Chrono(nbToProcess);
time.start();
final AbstractLog show = new IJStatus();
// get stack info
final float voisx = vx;
final float voisy = vy;
final float voisz = vz;
final ImageInt ima = stackorig;
// PARALLEL
final AtomicInteger ai = new AtomicInteger(0);
final int n_cpus = nbcpus == 0 ? ThreadUtil.getNbCpus() : nbcpus;
final int dec = (int) Math.ceil((double) ima.sizeZ / (double) n_cpus);
Thread[] threads = ThreadUtil.createThreadArray(n_cpus);
final ArrayList<Voxel3DComparable>[] listes = new ArrayList[n_cpus];
for (int ithread = 0; ithread < threads.length; ithread++) {
threads[ithread] = new Thread() {
@Override
public void run() {
for (int k = ai.getAndIncrement(); k < n_cpus; k = ai.getAndIncrement()) {
listes[k] = ima.getListMaxima(voisx, voisy, voisz, dec * k, dec * (k + 1), time, show);
}
}
};
}
ThreadUtil.startAndJoin(threads);
final ArrayList<Voxel3DComparable> liste = new ArrayList<Voxel3DComparable>();
for (ArrayList<Voxel3DComparable> li : listes) {
liste.addAll(li);
}
return liste;
}
use of mcib3d.utils.Chrono in project mcib3d-core by mcib3d.
the class Object3DSurface method computeVoxelsMultithread.
// private void computeVoxelsFill() {
// voxels = new ArrayList<Voxel3D>();
// // start at 1 1 1 to let 0 0 0 as background for fill holes
// int w = getXmax() - getXmin() + 2;
// int h = getYmax() - getYmin() + 2;
// int d = getZmax() - getZmin() + 2;
// ImageByte mask = new ImageByte("mask",w, h, d);
//
// Point3f vox;
// int x, y, z;
// int val = 1;
//
// Iterator it = unique_vertices.iterator();
// while (it.hasNext()) {
// vox = (Point3f) it.next();
// x = (int) (vox.getX() - getXmin() + 1);
// y = (int) (vox.getY() - getYmin() + 1);
// z = (int) (vox.getZ() - getZmin() + 1);
// mask.putPixel(x, y, z, val);
// }
// // fill holes 3D
// mask.fillHoles3D(0, val);
//
// // create voxels lists
// double xx, yy, zz;
// for (z = 0; z < mask.getSizez(); z++) {
// for (y = 0; y < mask.getSizey(); y++) {
// for (x = 0; x < mask.getSizex(); x++) {
// if (mask.getPixel(x, y, z) == val) {
// xx = x + getXmin() - 1;
// yy = y + getYmin() - 1;
// zz = z + getZmin() - 1;
// voxels.add(new Voxel3D(xx, yy, zz, val));
// }
// }
// }
// }
//
// }
// Voxellisation ; coordinates should be backed to pixels coordinates
private ArrayList<Voxel3D> computeVoxelsMultithread() {
final int zminv = (int) Math.floor(getZmin()) - 1;
final int yminv = (int) Math.floor(getYmin()) - 1;
final int xminv = (int) Math.floor(getXmin()) - 1;
final int zmaxv = (int) Math.ceil(getZmax()) + 1;
final int ymaxv = (int) Math.ceil(getYmax()) + 1;
final int xmaxv = (int) Math.ceil(getXmax()) + 1;
final int n_cpus = ThreadUtil.getNbCpus();
final int val = this.getValue();
final ArrayList[] voxelss = new ArrayList[n_cpus];
for (int i = 0; i < voxelss.length; i++) {
voxelss[i] = new ArrayList();
}
final Vector3D dir0 = new Vector3D(1, 0, 0);
final Vector3D dir1 = new Vector3D(-1, 0, 0);
final int dec = (int) Math.ceil((double) (zmaxv - zminv + 1) / (double) n_cpus);
// IJ.log("dec " + dec + " " + zminv + " " + zmaxv + " " + n_cpus);
// Timer
final Chrono time = new Chrono(zmaxv - zminv + 1);
time.start();
final AbstractLog show = new IJStatus();
final AtomicInteger ai = new AtomicInteger(0);
Thread[] threads = ThreadUtil.createThreadArray(n_cpus);
for (int ithread = 0; ithread < threads.length; ithread++) {
threads[ithread] = new Thread() {
@Override
public void run() {
boolean in;
Point3D origin;
for (int k = ai.getAndIncrement(); k < n_cpus; k = ai.getAndIncrement()) {
int zmaxx = Math.min(zminv + (k + 1) * dec, zmaxv);
for (float zi = zminv + dec * k; zi < zmaxx; zi += 1) {
// IJ.showStatus(k + " : Voxellisation " + zi + "/" + (zmaxx - 1));
for (float yi = yminv; yi <= ymaxv; yi += 1) {
in = false;
float xi = xminv;
while (xi <= xmaxv) {
if (!in) {
origin = new Point3D(xi, yi + 0.5, zi + 0.5);
double distMin = minDistSquareTriangles(origin, dir0, 1.0);
if (distMin <= 1) {
in = true;
} else if ((distMin >= 9.0) && (distMin < Double.MAX_VALUE)) {
// IJ.log(" " + distMin + " " + (Math.floor(Math.sqrt(distMin)) - 1));
xi += Math.floor(Math.sqrt(distMin)) - 1;
} else if (distMin == Double.MAX_VALUE) {
xi += xmaxv;
}
} else {
// voxels are in pixels not calibrated units
voxelss[k].add(new Voxel3D(xi, yi, zi, val));
origin = new Point3D(xi, yi + 0.5, zi + 0.5);
double distMin = minDistSquareTriangles(origin, dir1, 1);
if (distMin <= 1) {
in = false;
} else if ((distMin >= 9.0) && (distMin < Double.MAX_VALUE)) {
// IJ.log(" " + distMin + " " + (Math.floor(Math.sqrt(distMin)) - 1));
int nb = (int) Math.floor(Math.sqrt(distMin));
if (xi + nb < xmaxv) {
addLineXVoxels(voxelss[k], val, xi + 1, yi, zi, nb);
xi += nb;
in = false;
}
}
}
xi += 1;
}
}
String ti = time.getFullInfo(1);
if (ti != null)
show.log("3D voxellisation : " + ti);
}
}
}
};
}
ThreadUtil.startAndJoin(threads);
// put all arrays in one
ArrayList<Voxel3D> newVox = new ArrayList<Voxel3D>();
for (ArrayList voxels1 : voxelss) {
newVox.addAll(voxels1);
}
return newVox;
}
use of mcib3d.utils.Chrono in project mcib3d-core by mcib3d.
the class Align2DData method computeRotationOld.
/**
* Description of the Method
*
* @param range Description of the Parameter
* @param angleprecision Description of the Parameter
*/
public void computeRotationOld(double range, double angleprecision) {
ImageProcessor img1 = serie[0].getImageAdding(0, 0, 0);
ImageProcessor img2 = null;
double rx1 = (serie[0].getSizex() - 1.0) / 2 - Math.abs(serie[0].getTx());
double ry1 = (serie[0].getSizey() - 1.0) / 2 - Math.abs(serie[0].getTy());
double totangles = 0;
System.out.println("computing rotation...");
int nbcalc = (int) ((sizez - 1) * (range * 2 + 1) * angleprecision);
int cc = 0;
Chrono time = new Chrono(nbcalc);
time.start();
for (int i = 1; i < sizez; i++) {
double bestangle = 0;
double bestscore = -Double.MAX_VALUE;
double rx2 = (serie[i].getSizex() - 1.0) / 2 - Math.abs(serie[i].getTx());
double ry2 = (serie[i].getSizey() - 1.0) / 2 - Math.abs(serie[i].getTy());
double rxmin = (rx1 < rx2) ? rx1 : rx2;
double rymin = (ry1 < ry2) ? ry1 : ry2;
for (double angle = -range; angle <= range; angle += angleprecision) {
img2 = serie[i].getImageAdding(0, 0, angle);
// double score = score(img1, img2);
double score = correlation(img1, img2, rxmin, rymin);
if (score > bestscore) {
bestscore = score;
bestangle = angle;
}
cc++;
time.stop();
String strtime = "rotation : " + 100 * cc / nbcalc + "% remaining " + time.remainString(cc);
System.out.print("\r \r" + strtime + " total :" + time.totalTimeEstimateString(cc) + " ");
}
serie[i].addRotation(bestangle);
IJ.log("adding to " + i + " a rotation of " + bestangle);
totangles += bestangle;
img1 = serie[i].getImage(true);
rx1 = rx2;
ry1 = ry2;
}
totangles /= sizez - 1;
IJ.log("adding to all a rotation of " + (-totangles));
for (int i = 0; i < sizez; i++) {
serie[i].addRotation(-totangles);
}
}
use of mcib3d.utils.Chrono in project mcib3d-core by mcib3d.
the class Align2DData method XCorr.
/**
* crosscorrelation of all images
*/
public void XCorr() {
int rayon = sizex < sizey ? sizex / 2 : sizey / 2;
// ImageProcessor tmp = insert2(serie[0].getImage(true), rayon, true);
int oldtx = serie[0].getTx();
int oldty = serie[0].getTy();
ImageProcessor ip = serie[0].getImage(true);
ip.setRoi(selection);
FHTImage3D fht1 = new FHTImage3D(ip.crop());
FHTImage3D fht2;
int totx = 0;
int toty = 0;
System.out.println("Xcorr...");
Chrono time = new Chrono(sizez - 1);
time.start();
for (int i = 1; i < sizez; i++) {
// if (show) {
// IJ.showStatus("" + i + "/" + (sizez - 1));
// }
// tmp = insert2(serie[i].getImage(true), rayon, true);
ip = serie[i].getImage(true);
ip.setRoi(selection);
fht2 = new FHTImage3D(ip.crop());
Voxel3D max = FHTImage3D.getMaxCorrelation(fht1, fht2);
fht1 = fht2;
int tmpx = oldtx;
int tmpy = oldty;
oldtx = serie[i].getTx();
oldty = serie[i].getTy();
serie[i].addTranslation(serie[i - 1].getTx() + max.getX() - tmpx, serie[i - 1].getTy() + max.getY() - tmpy);
totx += serie[i].getTx();
toty += serie[i].getTy();
time.stop();
String strtime = "Xcorr : " + 100 * (i + 1) / sizez + "% remaining " + time.remainString(i);
System.out.print("\r \r" + strtime + " total :" + time.totalTimeEstimateString(i) + " ");
if (show) {
IJ.showStatus(strtime);
}
// System.out.print("\r" + 100 * (i + 1) / sizez + "% \t" + time.delayString() + "\t (" + time.remainString(i) + ") ");
}
totx /= sizez;
toty /= sizez;
for (int i = 0; i < sizez; i++) {
serie[i].addTranslation(-totx, -toty);
IJ.log(" final image " + i + " : tx =" + serie[i].getTx() + ", ty=" + serie[i].getTy());
}
System.out.print("\n");
IJ.freeMemory();
}
Aggregations