Skip to content
Snippets Groups Projects
Commit c7188448 authored by Walt Mankowski's avatar Walt Mankowski
Browse files

cleaned up code

* removed commented-out lines and most of the IJ.log() calls
* replaced vector of covariance matrix code with empty Mat
* restored seeding of RNG in constructor
* trimmed back import statements
parent 469e244d
No related branches found
No related tags found
No related merge requests found
Pipeline #
No preview for this file type
......@@ -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()));
// }
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;
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment