Hallo zusammen,
nachdem ihr mir zum Erkennen von geometrischen Figuren die Hough-Transformationen vorgeschlagen habt, habe ich nun den Akkumulator dafür programmiert. Ich habe zwar ein Ergebnis, aber noch offene Fragen zum besseren Verständnis und um ein Code Review würde ich auch bitten. Im Anhang findet ihr das Projekt mit Beispielbildern zum Testen, wenn ihr mögt.
Meine Fragsen sind:
1)Das .gif Format wird im Akkumulator nicht angezeigt. Konvertiert man .gif in .png gibt es keine Probleme.
2) In der Lektüre steht:rtfm:, dass es in der Praxis üblich ist, das Zentrum als Referenzpunkt für die x/y Bildkoordinate zu benutzen, dann ist der mögliche Bereich für den Radius auf die Hälfe der Bilddiagonale beschränkt. Das habe ichversucht umzusetzen, habe es aber nur teilweise geschafft.
3) In Zeile: 57 teile ich meine Anzahl der gewünschten Teilschritte durch PI und multipliziere anschließend mit der Zählvariablen. Dieser Schritt ist mir noch etwas unklar. Warum kann ich nicht direkt die Zählvariable als Grad in meine Hessesche Normalform einsetzten . z. B:
Oder ist das eine Maßnahme, damit man zwischen Radiant in Grad umrechnen kann?
Danke für jede Hilfe...
nachdem ihr mir zum Erkennen von geometrischen Figuren die Hough-Transformationen vorgeschlagen habt, habe ich nun den Akkumulator dafür programmiert. Ich habe zwar ein Ergebnis, aber noch offene Fragen zum besseren Verständnis und um ein Code Review würde ich auch bitten. Im Anhang findet ihr das Projekt mit Beispielbildern zum Testen, wenn ihr mögt.
Meine Fragsen sind:
1)Das .gif Format wird im Akkumulator nicht angezeigt. Konvertiert man .gif in .png gibt es keine Probleme.
2) In der Lektüre steht:rtfm:, dass es in der Praxis üblich ist, das Zentrum als Referenzpunkt für die x/y Bildkoordinate zu benutzen, dann ist der mögliche Bereich für den Radius auf die Hälfe der Bilddiagonale beschränkt. Das habe ichversucht umzusetzen, habe es aber nur teilweise geschafft.
3) In Zeile: 57 teile ich meine Anzahl der gewünschten Teilschritte durch PI und multipliziere anschließend mit der Zählvariablen. Dieser Schritt ist mir noch etwas unklar. Warum kann ich nicht direkt die Zählvariable als Grad in meine Hessesche Normalform einsetzten . z. B:
Java:
int r=(int) ((u*Math.cos(zaehlvaribale))+(v*Math.sin(zaehlvaribale)));
Danke für jede Hilfe...
Java:
package hough;
import hough.viewer.ImageViewer;
import java.awt.image.BufferedImage;
import java.awt.image.WritableRaster;
import java.io.File;
import java.io.IOException;
public class HoughLine {
private BufferedImage img;
private int[][] houghArray;
private int thetaMax=180;
private int rmax=0;
public HoughLine(BufferedImage input) {
this.img=input;
}
public static void main(String[] args) throws IOException {
String filename = "C://Users//jab//Programmierung//workspace_1//Hough//src//hough//pictures//oneEdge.png";
BufferedImage image = javax.imageio.ImageIO.read(new File(filename));
HoughLine hough=new HoughLine(image);
hough.createAccumulator();
}
private int[][] createAccumulator(){
int centerx=img.getWidth()/2;
int centery=img.getHeight()/2;
WritableRaster raster=img.getRaster();
//längste Strecke vom Zentrum des Bildes ausgesehen
rmax=(int) Math.sqrt((centerx*centerx)+(centery*centery));
System.out.println("Bildhöhe: "+img.getHeight());
System.out.println("Bildbreite: "+img.getWidth());
System.out.println("rmax: "+rmax);
System.out.println("------------------");
// houghArray = new int[thetaMax][rmax];
houghArray = new int[thetaMax][2*rmax];
/**
* u=x
* v=y
*/
for(int u = 0; u < img.getHeight();u++){
for(int v = 0; v < img.getWidth();v++){
int value=raster.getSample(v, u, 0);
if(value==255){
// System.out.println("\nKante gefunden: P("+v+"|"+u+")(x|y)");
for(int t=0; t<thetaMax;t++){
double theta = t*(Math.PI/180);
int r=(int) ((u*Math.cos(theta))+(v*Math.sin(theta)));
// int r=(int) ((u*Math.cos(t))+(v*Math.sin(t)));
// int r=(int) (u*Math.cos(((t)*Math.PI)/180)+v*Math.sin(((t)*Math.PI)/180));
// System.out.println("Für Theta: "+t+" distance: "+r);
//füllen des Akkumulator-Arrays
if((r >= 0) && (r <= rmax)){
houghArray[t][r]++;
}
}
}
}
}
/**
* Hough-Array (Voting-Matrix) auf Konsole ausgeben
*/
// for (int k = 0; k < houghArray.length; k++) {
// System.out.print(k+" Grad: ");
// for (int l = 0; l < houghArray[k].length; l++) {
// System.out.print(houghArray[k][l] + ",");
// }
// System.out.println("");
// }
ImageViewer imageViewer = new ImageViewer(img,"Hough_input");
imageViewer.setVisible(true);
BufferedImage houghLine=getHoughImage();
ImageViewer imageViewer2 = new ImageViewer(houghLine,"Hough_Line");
imageViewer2.setVisible(true);
System.out.println("HöchsterWert: "+getMaxHoughArray());
return null;
}
/**
* finde den Maximalen Wert im Hough-Array
* @return
*/
public int getMaxHoughArray() {
int max = 0;
for (int t = 0; t < thetaMax; t++) {
for (int r = 0; r < (2*rmax); r++) {
if (houghArray[t][r] > max) {
max = houghArray[t][r];
}
}
}
return max;
}
/**
* Zeige das Hough-Array als Bild an.
* @return
*/
public BufferedImage getHoughImage() {
int max = getMaxHoughArray();
BufferedImage image = new BufferedImage(thetaMax, rmax, BufferedImage.TYPE_BYTE_GRAY);
WritableRaster raster=image.getRaster();
for (int t = 0; t < thetaMax; t++) {
for (int r = 0; r < (rmax); r++) {
//normalisierten
double value = 255 * ((double) houghArray[t][r]) / max;
raster.setSample(t, r, 0,value);
}
}
System.out.println("Akku Breite: "+ image.getWidth());
System.out.println("Akku Höhe: "+image.getHeight());
image.setData(raster);
return image;
}
}
Zuletzt bearbeitet: