diff --git a/src/ImageJ/Demo_Pixel_Replication.class b/src/ImageJ/Demo_Pixel_Replication.class index b93e6f65527073fe6c482c886466be859450ebeb..abfd6f25b4ce98887396f6b55dc3cf91c4faff58 100644 Binary files a/src/ImageJ/Demo_Pixel_Replication.class and b/src/ImageJ/Demo_Pixel_Replication.class differ diff --git a/src/ImageJ/Demo_Pixel_Replication.java b/src/ImageJ/Demo_Pixel_Replication.java index 36c8ffb9fe5cb014a1f90dcdec73cb6a23508a76..3073d3ffc38677fb0145da596ca5a0db7f225d0d 100755 --- a/src/ImageJ/Demo_Pixel_Replication.java +++ b/src/ImageJ/Demo_Pixel_Replication.java @@ -4,8 +4,6 @@ import ij.process.*; import ij.gui.*; import java.awt.*; import java.awt.image.*; -import java.nio.ByteBuffer; -import java.nio.FloatBuffer; import java.util.ArrayList; import java.util.HashSet; import java.util.Random; @@ -15,16 +13,8 @@ import java.util.List; import org.opencv.core.Core; import org.opencv.core.Mat; import org.opencv.core.CvType; -import org.opencv.core.Scalar; -import org.opencv.core.MatOfPoint2f; -import org.opencv.core.Size; -import org.opencv.ml.*; +import org.opencv.ml.EM; import org.opencv.imgproc.Imgproc; -import org.opencv.utils.Converters; - -// import org.bytedeco.javacpp.indexer.*; -// import org.bytedeco.javacpp.indexer.DoubleIndexer; -// import org.bytedeco.javacpp.opencv_ml.*; public class Demo_Pixel_Replication implements PlugInFilter { @@ -44,7 +34,7 @@ public class Demo_Pixel_Replication implements PlugInFilter { UniqPts = new ArrayList<>(); PrPts = new ArrayList<>(); rnd = new Random(); - // Core.setRNGSeed(rnd.nextInt()); + Core.setRNGSeed(rnd.nextInt()); } public int setup(String arg, ImagePlus imp) { @@ -82,8 +72,6 @@ public class Demo_Pixel_Replication implements PlugInFilter { // use distance transform to populate UniqPts and PrPts Mat distMat = DistTransform(ipMat); - // byte buff[] = new byte[distMat.total() * distMat.channels()]; - // distMat.get(0, 0, buff); for (int y=r.y; y<(r.y+r.height); y++) { for (int x=r.x; x<(r.x+r.width); x++) { @@ -92,9 +80,7 @@ public class Demo_Pixel_Replication implements PlugInFilter { if (n > 0) { Point p = new Point(x, y); UniqPts.add(p); - long rep = Math.round((double)n/1.0); - // long rep = 1; - if (rep == 0) rep = 1; + long rep = Math.round((double)n); for (int i = 0; i < rep; i++) { PrPts.add(p); } @@ -102,7 +88,7 @@ public class Demo_Pixel_Replication implements PlugInFilter { } } - IJ.log(String.format("%d unique points, %d pixel rep points", UniqPts.size(), PrPts.size())); + // IJ.log(String.format("%d unique points, %d pixel rep points", UniqPts.size(), PrPts.size())); // compute the gmm EM em = computeGMM(k); @@ -134,8 +120,6 @@ public class Demo_Pixel_Replication implements PlugInFilter { Core.eigen(covs.get(i), true, eigVal, eigVec); double[] valIdx = new double[2]; eigVal.get(0, 0, valIdx); - // DoubleIndexer valIdx = eigVal.createIndexer(); - // if (valIdx.get(0,0) > valIdx.get(1,0)) { if (valIdx[0] > valIdx[1]) { hi = 0; lo = 1; @@ -146,16 +130,8 @@ public class Demo_Pixel_Replication implements PlugInFilter { double A = Math.sqrt(valIdx[hi] * 20 / 3); double B = Math.sqrt(valIdx[lo] * 20 / 3); - // double aspectRatio = B / A; EllipseRoi elRoi = makeEllipseRoi(means.row(i), eigVec.row(hi), A, B); - // Mat end1 = new Mat(); - // Mat end2 = new Mat(); - // scaleAdd(eigVec.row(hi), A, means.row(i), end1); - // scaleAdd(eigVec.row(hi), -A, means.row(i), end2); - // DoubleIndexer end1Idx = end1.createIndexer(); - // DoubleIndexer end2Idx = end2.createIndexer(); - // EllipseRoi elRoi = new EllipseRoi(end1Idx.get(0,0), end1Idx.get(0,1), end2Idx.get(0,0), end2Idx.get(0,1), aspectRatio); elRoi.setStrokeWidth(2); elRoi.setStrokeColor(Color.red); ellipses.add(elRoi); @@ -184,19 +160,15 @@ public class Demo_Pixel_Replication implements PlugInFilter { private Mat PrPts2Mat(ArrayList<Point> PrPts, double pct) { ArrayList<Point> ShufPts = new ArrayList<Point>(PrPts); Collections.shuffle(ShufPts); - // ArrayList<MatOfPoint2f> SampPts = new ArrayList<MatOfPoint2f>(ShufPts.subList(0, (int) (ShufPts.size() * pct))); - // return PrPts2Mat(SampPts); return PrPts2Mat(new ArrayList<Point>(ShufPts.subList(0, (int) (ShufPts.size() * pct)))); } private Mat PrPts2Mat(ArrayList<Point> PrPts) { Mat emMat = new Mat(PrPts.size(), 2, CvType.CV_32FC1); - // FloatIndexer emMatIndexer = emMat.createIndexer(); for (int i = 0; i < PrPts.size(); i++) { Point p = PrPts.get(i); float[] vals = { p.x, p.y }; emMat.put(i, 0, vals); - // emMatIndexer.put(i, 1, p.y()); } return emMat; @@ -206,7 +178,6 @@ public class Demo_Pixel_Replication implements PlugInFilter { EM bestEm = new EM(); double bestScore = -1e300; int bestI = 0; - // Mat initMeans = randomInitMeans(k); for (int i = 1; i <= Replicates; i++) { IJ.log(String.format("replicate %d", i)); @@ -214,7 +185,6 @@ public class Demo_Pixel_Replication implements PlugInFilter { Mat logLikelihoods = new Mat(PrPts.size(), 1, CvType.CV_64FC1); Mat labels = new Mat(PrPts.size(), 1, CvType.CV_32FC1); Mat covs0 = makeInitCovs(k); - // ArrayList<Mat> covs0 = makeInitCovs(k); Mat weights0 = makeInitWeights(k); em.setInt("nclusters", k); em.setInt("covMatType", EM.COV_MAT_GENERIC); @@ -224,16 +194,8 @@ public class Demo_Pixel_Replication implements PlugInFilter { // Mat emMat = PrPts2Mat(PrPts, 0.10); Mat emMat = PrPts2Mat(PrPts); Mat initMeans = randomInitMeans(k); - // em.trainE(emMat, initMeans, noArray()); - // if (!em.trainE(emMat, initMeans, new Mat(), new Mat(), logLikelihoods, labels, new Mat())) - // try { - IJ.log("calling trainE"); - if (!em.trainE(emMat, initMeans, covs0, weights0, logLikelihoods, labels, new Mat())) - // if (!em.train(emMat, logLikelihoods, new Mat(), new Mat())) - IJ.log("trainE() returned false!"); - // } catch (Exception e) { - // IJ.log(String.format("exception calling trainE: %s", e.getMessage())); - // } + if (!em.trainE(emMat, initMeans, covs0, weights0, logLikelihoods, labels, new Mat())) + IJ.log("trainE() returned false!"); double score = addUp(logLikelihoods.col(0)); IJ.log(String.format("score = %f", score)); if (score > bestScore) { @@ -243,73 +205,27 @@ public class Demo_Pixel_Replication implements PlugInFilter { } } - IJ.log(String.format("best replicate was %d", bestI)); + // IJ.log(String.format("best replicate was %d", bestI)); return bestEm; } private double addUp(Mat m) { - // DoubleIndexer idx = m.createIndexer(); double total = 0; double[] data = new double[(int) m.total()]; m.get(0, 0, data); - for (int i = 0; i < m.total(); i++) - total += data[i]; - - // for (int r = 0; r < m.rows(); r++) { - // double[] idx = m.get(r, 0); - // // total += idx.get(r, 0); - // total += idx[0]; - // } + for (double val : data) + total += val; return total; } private Mat makeInitCovs(int k) { - // private ArrayList<Mat> makeInitCovs(int k) { - // Mat covs0 = new Mat(1, 4*k, CV_64FC1); - // DoubleIndexer idx = covs0.createIndexer(); - // for (int i = 0; i < 4*k; i += 4) { - // idx.put(0, i, 1); - // idx.put(0, i+1, 0); - // idx.put(0, i+2, 0); - // idx.put(0, i+3, 1); - // } - - // return covs0; - // return new Mat(); - // return Mat.eye(new Size(2,2), CvType.CV_64F); - - IJ.log("eye = " + Mat.eye(new Size(2,2), CvType.CV_64F).dump()); - IJ.log("eye channels = " + Mat.eye(new Size(2,2), CvType.CV_64F).channels()); - IJ.log("eye size = " + Mat.eye(new Size(2,2), CvType.CV_64F).size()); - - ArrayList<Mat> mats = new ArrayList<Mat>(); - for (int i = 0; i < k; i++) - mats.add(Mat.eye(new Size(2,2), CvType.CV_64F)); - // return mats; - - Mat res = Converters.vector_Mat_to_Mat(mats); - // res = res.reshape(2, 2); - Size size = res.size(); - IJ.log(String.format("mats.size() = %d, res.size() = %f x %f", mats.size(), size.height, size.width)); - IJ.log("covs = " + res.dump()); - IJ.log("res.channels = " + res.channels()); - IJ.log("res.size = " + res.size()); - return res; + return new Mat(); } private Mat makeInitWeights(int k) { - // Mat weights0 = new Mat(k, 1, CV_64FC1); - // DoubleIndexer idx = weights0.createIndexer(); - // double weight = 1/k; - - // for (int r = 0; r < k; r++) - // idx.put(r, 0, weight); - - // return weights0; - // return new Mat(); - return new Mat(k, 1, CvType.CV_64F, new Scalar(1/k)); + return new Mat(); } private EllipseRoi makeEllipseRoi(Mat center, Mat unitVec, double A, double B) { @@ -326,7 +242,6 @@ public class Demo_Pixel_Replication implements PlugInFilter { end1.get(0, 0, data1); end2.get(0, 0, data2); - // return new EllipseRoi(end1Idx.get(0,0), end1Idx.get(0,1), end2Idx.get(0,0), end2Idx.get(0,1), aspectRatio); return new EllipseRoi(data1[0], data1[1], data2[0], data2[1], aspectRatio); } @@ -343,25 +258,16 @@ public class Demo_Pixel_Replication implements PlugInFilter { int j = rnd.nextInt(UniqPts.size()); if (!used.contains(j)) { Point p = UniqPts.get(j); - // meansIdx.put(i, 0, p.x()); - // meansIdx.put(i, 1, p.y()); meansData[n++] = p.x; meansData[n++] = p.y; used.add(j); - IJ.log(String.format("random pt %d: (%d,%d)", i, p.x, p.y)); + // IJ.log(String.format("random pt %d: (%d,%d)", i, p.x, p.y)); i++; } } means.put(0, 0, meansData); - for (int r = 0; r < means.rows(); r++) { - for (int c = 0; c < means.cols(); c++) { - double[] val = means.get(r, c); - IJ.log(String.format("means(%d,%d) = %f", r, c, val[0])); - } - } - return means; } }