Search in sources :

Example 6 with Chrono

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;
}
Also used : Chrono(mcib3d.utils.Chrono) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) IJStatus(mcib3d.utils.Logger.IJStatus) AbstractLog(mcib3d.utils.Logger.AbstractLog)

Example 7 with Chrono

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;
}
Also used : Chrono(mcib3d.utils.Chrono) IJStatus(mcib3d.utils.Logger.IJStatus) AbstractLog(mcib3d.utils.Logger.AbstractLog) ArrayList(java.util.ArrayList) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) Voxel3DComparable(mcib3d.geom.Voxel3DComparable)

Example 8 with Chrono

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;
}
Also used : Chrono(mcib3d.utils.Chrono) IJStatus(mcib3d.utils.Logger.IJStatus) AbstractLog(mcib3d.utils.Logger.AbstractLog) AtomicInteger(java.util.concurrent.atomic.AtomicInteger)

Example 9 with Chrono

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);
    }
}
Also used : Chrono(mcib3d.utils.Chrono) ImageProcessor(ij.process.ImageProcessor)

Example 10 with Chrono

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();
}
Also used : Chrono(mcib3d.utils.Chrono) ImageProcessor(ij.process.ImageProcessor) Voxel3D(mcib3d.geom.Voxel3D) FHTImage3D(mcib3d.image3d.legacy.FHTImage3D)

Aggregations

Chrono (mcib3d.utils.Chrono)14 AtomicInteger (java.util.concurrent.atomic.AtomicInteger)9 AbstractLog (mcib3d.utils.Logger.AbstractLog)9 IJStatus (mcib3d.utils.Logger.IJStatus)7 ImageProcessor (ij.process.ImageProcessor)3 ArrayList (java.util.ArrayList)3 Object3DVoxels (mcib3d.geom.Object3DVoxels)2 Voxel3DComparable (mcib3d.geom.Voxel3DComparable)2 Vector3D (mcib3d.geom.Vector3D)1 Voxel3D (mcib3d.geom.Voxel3D)1 FHTImage3D (mcib3d.image3d.legacy.FHTImage3D)1 IJLog (mcib3d.utils.Logger.IJLog)1