diff --git a/LinearRegressionTool/src/main/java/model/LineModel.java b/LinearRegressionTool/src/main/java/model/LineModel.java index 5244712..65c7c33 100644 --- a/LinearRegressionTool/src/main/java/model/LineModel.java +++ b/LinearRegressionTool/src/main/java/model/LineModel.java @@ -1,7 +1,11 @@ package model; +import sun.awt.image.ImageWatched; + +import java.util.ArrayList; import java.util.Collections; import java.util.LinkedList; +import java.util.List; /** * Implementierung verschiedener Algorithmen zur Berechnung von Ausgleichsgeraden. @@ -12,7 +16,7 @@ import java.util.LinkedList; */ public class LineModel { - private LinkedList nodes; + private ArrayList nodes; private LinkedList lines; private Double xMinimum; private Double xMaximum; @@ -20,7 +24,7 @@ public class LineModel { private Double yMaximum; public LineModel() { - nodes = new LinkedList<>(); + nodes = new ArrayList<>(); lines = new LinkedList<>(); } @@ -52,10 +56,14 @@ public class LineModel { this.lines.add(line); } - public LinkedList getNodes() { + public ArrayList getNodes() { return nodes; } + public void setNodes(ArrayList nodes) { + this.nodes = nodes; + } + public LinkedList getLines() { return lines; } diff --git a/LinearRegressionTool/src/main/java/presenter/AbstractPresenter.java b/LinearRegressionTool/src/main/java/presenter/AbstractPresenter.java index f9c594d..94875fb 100644 --- a/LinearRegressionTool/src/main/java/presenter/AbstractPresenter.java +++ b/LinearRegressionTool/src/main/java/presenter/AbstractPresenter.java @@ -1,16 +1,12 @@ package presenter; import model.Interval; -import model.Line; import model.LineModel; import presenter.algorithms.util.IntersectionCounter; import presenter.evaluation.EvaluateAlgorithms; -import presenter.evaluation.PictureProcessor; import view.MainFrame; import javax.swing.*; -import java.util.LinkedList; -import java.util.List; import java.util.Observable; import java.util.Observer; @@ -156,31 +152,10 @@ public abstract class AbstractPresenter implements Observer { public void setup() { //Darstellung der Schnittpunkte in einer Tabelle - List heading = new LinkedList<>(); - List> rows = new LinkedList<>(); - heading.add("Geraden im Dualraum"); - for (int j = 0; j < getModel().getLines().size() - 2; j++) { - LinkedList rowEntry = new LinkedList<>(); - Line p1 = getModel().getLines().get(j); - String sign = p1.getB() < 0 ? "" : "+"; - rowEntry.add("f(x) = " +String.format("%.3f", p1.getM()) + "x "+ sign + String.format("%.3f",p1.getB())); - - if (j + 1 < getModel().getLines().size()) { - Line p2 = getModel().getLines().get(j + 1); - sign = p2.getB() < 0 ? "" : "+"; - rowEntry.add("f(x) = " +String.format("%.3f",p2.getM()) + "x" + sign + String.format("%.3f", p2.getB())); - } - - if (j + 2 < getModel().getLines().size()) { - Line p3 = getModel().getLines().get(j + 2); - sign = p3.getB() < 0 ? "" : "+"; - rowEntry.add("f(x) = " + String.format("%.3f",p3.getM()) + "x"+ sign + String.format("%.3f",p3.getB())); - } - rows.add(rowEntry); - } - getView().createTable(heading, rows); - - getView().log("
"); + SwingUtilities.invokeLater(() -> { + getView().logSuccess("Der Import der Daten war Erfolgreich!"); + getView().log("
"); + }); } diff --git a/LinearRegressionTool/src/main/java/presenter/algorithms/advanced/LeastMedianOfSquaresEstimator.java b/LinearRegressionTool/src/main/java/presenter/algorithms/advanced/LeastMedianOfSquaresEstimator.java index db6f0e1..d05abc2 100644 --- a/LinearRegressionTool/src/main/java/presenter/algorithms/advanced/LeastMedianOfSquaresEstimator.java +++ b/LinearRegressionTool/src/main/java/presenter/algorithms/advanced/LeastMedianOfSquaresEstimator.java @@ -22,7 +22,7 @@ public class LeastMedianOfSquaresEstimator extends Observable implements Algorit private Presenter presenter; private LinkedList set = new LinkedList<>(); - private LinkedList intersections = new LinkedList<>(); + private ArrayList intersections = new ArrayList<>(); private IntersectionCounter invCounter = new IntersectionCounter(); private int n; private double quantileError; @@ -39,7 +39,7 @@ public class LeastMedianOfSquaresEstimator extends Observable implements Algorit private Double slope; private Double yInterception; - public LeastMedianOfSquaresEstimator(LinkedList set, LinkedList intersections, + public LeastMedianOfSquaresEstimator(LinkedList set, ArrayList intersections, Presenter presenter) { this.set = set; this.intersections = intersections; @@ -55,7 +55,7 @@ public class LeastMedianOfSquaresEstimator extends Observable implements Algorit this.presenter = presenter; } - public LeastMedianOfSquaresEstimator(LinkedList set, LinkedList intersections) { + public LeastMedianOfSquaresEstimator(LinkedList set, ArrayList intersections) { this(set, intersections, null); } @@ -78,7 +78,7 @@ public class LeastMedianOfSquaresEstimator extends Observable implements Algorit intervals = new PriorityQueue<>(comparator); intervals.add(new Interval(-100000, 100000)); heightsigmaMin = Double.MAX_VALUE; - LinkedList tmpIntersections = intersections; + ArrayList tmpIntersections = intersections; //(3.) Apply the following steps as long as the exists active intervals boolean active = true; @@ -265,11 +265,7 @@ public class LeastMedianOfSquaresEstimator extends Observable implements Algorit beta[i] = n - (alpha[i] + strictlyGreater); strictlyGreater = 0; } - //TEST der Alpha und Beta werte, siehe JUnit Test - //for (int i=0;i= n) { - //System.out.println("i: "+i+", j:"+j+". ungültig"); pslab.setActivity(false); break; } else { @@ -292,7 +284,6 @@ public class LeastMedianOfSquaresEstimator extends Observable implements Algorit Math.abs(umaxList.get(j) - umaxList.get(i))); double error = 0.01; if (((1 + error) * h) < heightsigmaMin) { - //System.out.println("h: "+ h +" ist kleiner als height(sigmaMin): "+heightsigmaMin); pslab.setActivity(true); return; } @@ -382,11 +373,11 @@ public class LeastMedianOfSquaresEstimator extends Observable implements Algorit this.set = set; } - public LinkedList getIntersections() { + public ArrayList getIntersections() { return intersections; } - public void setIntersections(LinkedList intersections) { + public void setIntersections(ArrayList intersections) { this.intersections = intersections; } diff --git a/LinearRegressionTool/src/main/java/presenter/algorithms/advanced/TheilSenEstimator.java b/LinearRegressionTool/src/main/java/presenter/algorithms/advanced/TheilSenEstimator.java index 321d311..5728251 100644 --- a/LinearRegressionTool/src/main/java/presenter/algorithms/advanced/TheilSenEstimator.java +++ b/LinearRegressionTool/src/main/java/presenter/algorithms/advanced/TheilSenEstimator.java @@ -47,7 +47,7 @@ public class TheilSenEstimator extends Observable implements Algorithm { private Double yInterception; - public TheilSenEstimator(LinkedList setOfLines, LinkedList setOfIntersections, Presenter presenter) { + public TheilSenEstimator(LinkedList setOfLines, ArrayList setOfIntersections, Presenter presenter) { this.presenter = presenter; this.setOfLines = new ArrayList<>(setOfLines); this.setOfIntersections = new ArrayList<>(setOfIntersections); @@ -61,7 +61,7 @@ public class TheilSenEstimator extends Observable implements Algorithm { this.k = Integer.valueOf((int) (N * 0.5)) - 1; } - public TheilSenEstimator(LinkedList setOfLines, LinkedList setOfIntersections) { + public TheilSenEstimator(LinkedList setOfLines, ArrayList setOfIntersections) { this(setOfLines, setOfIntersections, null); } diff --git a/LinearRegressionTool/src/main/java/presenter/algorithms/util/FastElementSelector.java b/LinearRegressionTool/src/main/java/presenter/algorithms/util/FastElementSelector.java index de35eb5..09c7f51 100644 --- a/LinearRegressionTool/src/main/java/presenter/algorithms/util/FastElementSelector.java +++ b/LinearRegressionTool/src/main/java/presenter/algorithms/util/FastElementSelector.java @@ -2,6 +2,7 @@ package presenter.algorithms.util; import java.util.ArrayList; import java.util.Collections; +import java.util.List; import java.util.Random; /** @@ -14,7 +15,7 @@ public class FastElementSelector { * @param i * @return */ - public static Double randomizedSelect(ArrayList a, double i) { + public static Double randomizedSelect(List a, double i) { int start = 0; int end = a.size() - 1; @@ -48,7 +49,7 @@ public class FastElementSelector { * @param end * @return */ - private static int randomizedPartition(ArrayList a, int start, int end) { + private static int randomizedPartition(List a, int start, int end) { int i = 0; Random random = new Random(System.currentTimeMillis()); @@ -69,7 +70,7 @@ public class FastElementSelector { * @param end * @return */ - private static int partition(ArrayList a, int start, int end) { + private static int partition(List a, int start, int end) { Double x = a.get(end); int i = start - 1; for (int j = start; j <= end - 1; j++) { diff --git a/LinearRegressionTool/src/main/java/presenter/evaluation/EvaluateAlgorithms.java b/LinearRegressionTool/src/main/java/presenter/evaluation/EvaluateAlgorithms.java index adac9e6..caf128a 100644 --- a/LinearRegressionTool/src/main/java/presenter/evaluation/EvaluateAlgorithms.java +++ b/LinearRegressionTool/src/main/java/presenter/evaluation/EvaluateAlgorithms.java @@ -32,8 +32,8 @@ public class EvaluateAlgorithms extends Observable { private LinkedList rmL; private LinkedList tsL; - private LinkedList lmsP; - private LinkedList tsP; + private ArrayList lmsP; + private ArrayList tsP; private Thread lmsThread; private Thread rmThread; @@ -92,8 +92,8 @@ public class EvaluateAlgorithms extends Observable { rmL = new LinkedList<>(arrangement.getLines()); tsL = new LinkedList<>(arrangement.getLines()); - lmsP = new LinkedList<>(arrangement.getNodes()); - tsP = new LinkedList<>(arrangement.getNodes()); + lmsP = new ArrayList<>(arrangement.getNodes()); + tsP = new ArrayList<>(arrangement.getNodes()); } public void run() throws InterruptedException { diff --git a/LinearRegressionTool/src/main/java/presenter/evaluation/PictureProcessor.java b/LinearRegressionTool/src/main/java/presenter/evaluation/PictureProcessor.java index a3e8b46..71c7adc 100644 --- a/LinearRegressionTool/src/main/java/presenter/evaluation/PictureProcessor.java +++ b/LinearRegressionTool/src/main/java/presenter/evaluation/PictureProcessor.java @@ -1,27 +1,17 @@ package presenter.evaluation; +import jdk.nashorn.internal.scripts.JD; import model.Line; -import org.opencv.core.Core; -import org.opencv.core.CvType; -import org.opencv.core.Mat; -import org.opencv.core.Size; +import org.opencv.core.*; import org.opencv.highgui.*; import org.opencv.imgproc.Imgproc; import presenter.Presenter; -import presenter.algorithms.advanced.LeastMedianOfSquaresEstimator; -import javax.imageio.ImageIO; import javax.swing.*; -import javax.swing.filechooser.FileFilter; -import javax.swing.filechooser.FileNameExtensionFilter; -import javax.swing.filechooser.FileSystemView; -import java.awt.*; import java.awt.image.BufferedImage; import java.awt.image.DataBufferByte; import java.io.File; -import java.lang.reflect.InvocationTargetException; -import java.util.LinkedList; +import java.util.ArrayList; import java.util.Observable; -import java.util.Observer; /** * Implementierung verschiedener Algorithmen zur Berechnung von Ausgleichsgeraden. @@ -33,9 +23,10 @@ import java.util.Observer; public class PictureProcessor extends Observable{ private Mat image; - private Mat threshold; + private Mat contour; private Presenter presenter; private File file; + private ArrayList contours; public PictureProcessor(Presenter presenter, File file) { this.file = file; @@ -43,24 +34,36 @@ public class PictureProcessor extends Observable{ } public void run(){ - String msg = ""; - msg = SwingUtilities.isEventDispatchThread() ? "EDT" : "nicht EDT"; - System.out.println(msg); - - System.out.println("Welcome to OpenCV " + Core.VERSION); - image = Highgui.imread(file.getAbsolutePath()); - threshold = process(image); - createInputData(threshold); + contour = process(image); + createInputData(); } private Mat process(Mat image){ - threshold = new Mat(image.width(), image.height(), CvType.CV_8UC1); + Mat threshold = new Mat(image.width(), image.height(), CvType.CV_8UC1); Mat source = new Mat(image.width(), image.height(), CvType.CV_8UC1); Imgproc.cvtColor(image, source, Imgproc.COLOR_BGR2GRAY); - Imgproc.adaptiveThreshold(source, threshold,255, Imgproc.ADAPTIVE_THRESH_MEAN_C, - Imgproc.THRESH_BINARY_INV, 11,2); - return threshold; + Imgproc.blur(source, threshold, new Size(3,3)); + Imgproc.Canny(threshold, source,300,600,5,true); + + //Konturen berechnen und filtern + contours = new ArrayList<>(); + Imgproc.findContours(source, contours, new Mat(), Imgproc.RETR_TREE, Imgproc.CHAIN_APPROX_SIMPLE, new Point(0,0)); + Mat viscont = new Mat(source.size(), source.type()); + for (int i=0;i 20) { + Imgproc.drawContours(viscont, contours, i, new Scalar(255, 255, 255), -1); + } else { + contours.remove(i); + } + } + SwingUtilities.invokeLater(() -> { + JDialog dialog = new JDialog(); + dialog.setSize(1100,700); + dialog.add(new JLabel(new ImageIcon(toBufferedImage(viscont)))); + dialog.setVisible(true); + }); + return source; } @@ -79,26 +82,26 @@ public class PictureProcessor extends Observable{ } - private void createInputData(Mat image){ + private void createInputData(){ Thread t = new Thread(() -> { int id = 0; - for (int i=0;i lines, LinkedList points, Double xmin, Double xmax, Double ymin, Double ymax) { + public void setPrameters(LinkedList lines, ArrayList points, Double xmin, Double xmax, Double ymin, Double ymax) { this.lines = new LinkedList<>(lines); this.points = new LinkedList<>(points); this.domainMin = xmin; diff --git a/LinearRegressionTool/src/test/java/presenter/algorithms/LeastMedianOfSquaresEstimatorTest.java b/LinearRegressionTool/src/test/java/presenter/algorithms/LeastMedianOfSquaresEstimatorTest.java index 4577c9f..435690b 100644 --- a/LinearRegressionTool/src/test/java/presenter/algorithms/LeastMedianOfSquaresEstimatorTest.java +++ b/LinearRegressionTool/src/test/java/presenter/algorithms/LeastMedianOfSquaresEstimatorTest.java @@ -32,7 +32,7 @@ public class LeastMedianOfSquaresEstimatorTest { Double[] y = {18d, 26d, 30d, 40d, 70d}; LinkedList lines = new LinkedList<>(); - LinkedList intersections = new LinkedList<>(); + ArrayList intersections = new ArrayList<>(); for (int i = 0; i < 5; i++) { lines.add(new Line(x[i], y[i]));