Eclipse Stackoverflow beim Einlesen von großen Bilder in kd Baum

Megara

Mitglied
Hallo liebe Java Freunde,
Bin neu hier im Forum und ich hoffe ihr könnt mir bei meinem Problem weiterhelfen.

Möchte gerne Farbinformationen aus einem beliebigem Bild auslesen und in einem kd Baum speichern nach den RGB Werten. Bei kleinen Bildern (Bsp. 150x150 oder 400x276) klappt es gut aber bei grösseren Bildern (Bsp. 1024x1024) bekomme ich Stackoverflow. Wie kann ich das Problem bereinigen.

Farbobjekt.java
Java:
import java.awt.Color;


public class Farbobjekt {
	
	// RGB Farbwerte
	private int Rot;
	private int Gruen;
	private int Blau;
	
	// X,Y Koordinaten
	private int X;
	private int Y;
	
	// Konstruktor
	public Farbobjekt(Color c){//, Point p){
		this.Rot = c.getRed();
		this.Gruen = c.getGreen();
		this.Blau = c.getBlue();
		//this.X = p.x;
		//this.Y = p.y;
	}
	
	// gibt den Rotwert des Farbobjekts zurück
	public int getRot(){
		return Rot;
	}
	
	// gibt den Grünwert des Farbobjekts zurück
	public int getGruen(){
		return Gruen;
	}
	
	// gibt den Blauwert des Farbobjekts zurück
	public int getBlau(){
		return Blau;
	}
	
	// gibt die X Koordinate des Farbobjekts zurück
	public int getX(){
		return X;
	}
	
	// gibt die Y Koordinate des Farbobjekts zurück
	public int getY(){
		return Y;
	}
	
	public String toString(){
		return "R : " + this.Rot + " G : " + this.Gruen + " B : " + this.Blau;
	}
}

Knoten.java
Java:
/*
 * Ein Knoten eines kd-Baums enthält ein Farbobjekt
 */

public class Knoten {
	
	public Knoten links;
	public Knoten rechts;
	
	private Farbobjekt pixel;
	
	// Konstruktor
	public Knoten(Farbobjekt pixel){
		this.pixel = pixel;
		this.links = null;
		this.rechts = null;
	}
	
	// gibt im Knoten gespeichertes Farbobjekt zurück
	public Farbobjekt getPixel(){
		return pixel;
	}

}

KdBaum.java
Java:
public class KdBaum {

	Knoten wurzel;

	// Konstruktor
	public KdBaum(){
		wurzel = null;
	}

	public void erstellen(Farbobjekt neuPixel){
		wurzel = einfuegen(wurzel, neuPixel, 0);
	}

	/*
	 * einfuegen = fügt einen neuen Knoten in den kd Baum ein
	 * ist die Wurzel "null" wird der aktuelle Knoten als Wurzel festgelegt
	 * Ebene 0 : der Rot Wert wird verglichen.
	 * Ebene 1 : der Grün Wert wird verglichen
	 * Ebene 2 : der Blau Wert wird verglichen
	 * ist der Wert (R,G,B) des neuen Knotens <= als der Wert des aktuellen Knotens wird der
	 * neue Knoten links in den kd Baum eingefügt.
	 * ist der Wert (R,G,B) des neuen Knotens > als der Wert des aktuellen Knotens wird der
	 * neue Knoten rechts in den kd Baum eingefügt. 
	 */
	private Knoten einfuegen(Knoten aktuellerKnoten, Farbobjekt neuPixel, int ebene){
		if(aktuellerKnoten == null){
			aktuellerKnoten = new Knoten(neuPixel);
		}
		else{
			//System.out.println("Ebene " + ebene);
			switch(ebene % 3){
			case 0 :
				if(neuPixel.getRot()<=aktuellerKnoten.getPixel().getRot()){
					//System.out.println("Ebene : " + ebene + " " + aktuellerKnoten.getPixel().getRot() + " Links " + neuPixel.getRot());
					aktuellerKnoten.links = einfuegen(aktuellerKnoten.links, neuPixel, ebene+1);										
				}
				else{
					//System.out.println("Ebene : " + ebene + " " + aktuellerKnoten.getPixel().getRot() + " Rechts " + neuPixel.getRot());
					aktuellerKnoten.rechts = einfuegen(aktuellerKnoten.rechts, neuPixel, ebene+1);
				}
				break;
			case 1 :
				if(neuPixel.getGruen()<=aktuellerKnoten.getPixel().getGruen()){
					//System.out.println("Ebene : " + ebene + " " + aktuellerKnoten.getPixel().getGruen() + " Links " + neuPixel.getGruen());
					aktuellerKnoten.links = einfuegen(aktuellerKnoten.links, neuPixel, ebene+1);										
				}
				else{
					//System.out.println("Ebene : " + ebene + " " + aktuellerKnoten.getPixel().getGruen() + " Rechts " + neuPixel.getGruen());
					aktuellerKnoten.rechts = einfuegen(aktuellerKnoten.rechts, neuPixel, ebene+1);
				}
				break;
			case 2 :
				if(neuPixel.getBlau()<=aktuellerKnoten.getPixel().getBlau()){
					//System.out.println("Ebene : " + ebene + " " + aktuellerKnoten.getPixel().getBlau() + " Links " + neuPixel.getBlau());
					aktuellerKnoten.links = einfuegen(aktuellerKnoten.links, neuPixel, ebene+1);										
				}
				else{
					//System.out.println("Ebene : " + ebene + " " + aktuellerKnoten.getPixel().getBlau() + " Rechts " + neuPixel.getBlau());
					aktuellerKnoten.rechts = einfuegen(aktuellerKnoten.rechts, neuPixel, ebene+1);
				}
				break;
			}
		}
		return aktuellerKnoten;
	}

	public void KnotenListe(){
		Preorder(wurzel,0);
	}

	private void Preorder(Knoten aktuell, int ebene){
		if(aktuell != null){
			System.out.println("Ebene : " + ebene + " " + aktuell.getPixel().toString());
			Preorder(aktuell.links,ebene++);
			Preorder(aktuell.rechts,ebene++);
		}
	}
}

Main.java
Java:
import java.awt.Color;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;

public class Main {
	
	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub		
		KdBaum Baum = new KdBaum();
		BufferedImage img = ImageIO.read(new File("C:/Bild.jpg")); // 1024x1024
		//BufferedImage img = ImageIO.read(new File("C:/Bild1_klein.jpg")); // 150x150
		//BufferedImage img = ImageIO.read(new File("C:/Bild4.jpg")); // 400x276
		for(int i=0;i<img.getWidth();i++){
			for(int j=0;j<img.getHeight();j++){
				int rgb = img.getRGB(i,j);
				Color c = new Color(rgb);
				Farbobjekt PixelFarbe = new Farbobjekt(c);
				Baum.erstellen(PixelFarbe);
			}
		}
		Baum.KnotenListe();
	}
}

Problem Bild (1024x1024) im Anhang ^^

Danke für eure Hilfe :)
Gruß,
Megara
 
G

Gast2

Gast
Deine Rekursion in der Methode einfuegen ist zu tief. Entweder begnügst du dich mit kleineren Bildern oder du musst die Rekursion auflösen und die Methode iterativ implementieren.
 

jgh

Top Contributor
Run -> Run Configuration -> den "Reiter" (X)=Arguments -> im Feld VM-Arguments -Xss10m eingeben und applien
 

Megara

Mitglied
Danke für deine Hilfe.

Habe das wie angegeben beim Projekt angegeben. Dadurch wird mein Laptop und das Programm langsam. Hab mal einen Screenshot gemacht für den Fall falls ich es an der falschen Stelle angegeben habe.

Gruss,
Megara
 
S

SlaterB

Gast
ist das Programm auch mit kleinen Bildern langsamer?
mit dem großen stürzte es vorher ab, das ist ja nicht unbedingt zu vergleichen,
1 Mio. Pixel sind nunmal etwas Arbeit, gerade mit Bildern hat Java zu tun
 

jgh

Top Contributor
evtl. solltest du dir überlegen, ob du das überhaupt willst und es dein Problem löst.

-Xss = the stack size for each thread
-Xms = initial java heap size
-Xmx = maximum java heap size
-Xmn = the size of the heap for the young generation

oder ob dir nicht eines der anderen VM-Arguments eher hilft?!
ich bin da nicht so in der Materie firm, sondern konnte dir nur sagen, wo du es bei eclipse einfügen musst.
Evtl. auch eine Kombination aus den möglichen Argumenten...?!
 

Megara

Mitglied
Danke Jungs für eure Hilfe.
Bei kleineren Bilder mit vielen Farben hat das Program keine Probleme. Nur bei größeren Bilder und bei Bilder mit vielen gleichen Farben (Bsp. Vereinslogo BVB -> viel Gelb) tritt das Problem mit dem Stackoverflow auf.
 
S

SlaterB

Gast
ist das Thema beendet?
bitte immer ganz genau aufpassen was du in deine Postings schreibst, möglichst eindeutig formulieren
 

Megara

Mitglied
ist das Thema beendet?
bitte immer ganz genau aufpassen was du in deine Postings schreibst, möglichst eindeutig formulieren

Das Thema ist noch nicht beendet. Würde mich über weitere Lösungsansätze sehr freuen.
Das Problem mit dem Stack overflow tritt noch bei folgenden Bilder auf:
Bei kleineren Bilder mit vielen Farben hat das Program keine Probleme. Nur bei größeren Bilder und bei Bilder mit vielen gleichen Farben (Bsp. Vereinslogo BVB -> viel Gelb) tritt das Problem mit dem Stackoverflow auf.

Gruss,
Megara
 
S

SlaterB

Gast
zwei Tipps habe ich noch, zum einen:
die erhöhte StackSize kann sich evtl. nur auf neu gestartete Threads beziehen, nicht auf den main-Thread,
Testprogramm:
Java:
public class Test {
    public static void main(String[] args)  {
        Runnable r = new Runnable()    {
                public void run()   {
                    A a = new A();
                    try  {
                        a.test();
                    }   catch (Throwable e)  {   }
                    System.out.println(a.k + ", " + Thread.currentThread());
                }
            };

        new Thread(r).start();
        r.run();
    }
}

class A {
    int k;

    void test()  {
        k++;
        test();
    }
}
Ausgabe bei mir mit -Xss10m:
Code:
10922, Thread[main,5,main] // wenig für main
519139, Thread[Thread-0,5,main] // viel für neuen Thread

-----------

zum anderen aber, viel wichtiger:
fast kein Programm sollte tausende ineinander geschachtelte Methodenaufrufe haben,
Rekursion kann man auch immer durch Schleifen ersetzen, und sei es while(true) zusammen mit dynamisch gesetzen Variablen,

kennst du den A*-Algorithmus?
A*-Algorithmus ? Wikipedia
da läuft auch nur eine riesige Schleife, neue zu bearbeitende Knoten werden in eine Liste eingefügt und nach und nach herausgeholt,
beim nächsten Schleifendurchlauf

wenn du in einem 1000x1000 Quadrat herumläufst, was auch immer du da machst, kannst du vielleicht mit Schleifen und Indexen noch geordneter vorgehen
 

jgh

Top Contributor
Die Wahl der Programmiersprache ist freigestellt. Auch freigestellt ist, ob Sie reale Bilder verwenden oder Bilder einfach durch 2-*‐dim. Arrays simulieren.
dann verwende doch fürs erste ein 2-dim Array mit einer wie im Bsp benutzen 8x8 Matrix?!
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
D Stackoverflow verhindern Allgemeine Java-Themen 4
K Threads StackOverflow Allgemeine Java-Themen 12
S Binärer Suchbaum Stackoverflow Problem Allgemeine Java-Themen 4
S StackOverflow Allgemeine Java-Themen 7
H StackOverflow Fehler? Allgemeine Java-Themen 3
foobar [groovy]Stackoverflow bei invokeMethod Allgemeine Java-Themen 3
J Warum Stackoverflow oder Nullpointerexeption? Allgemeine Java-Themen 4
S StackOverflow Allgemeine Java-Themen 10
S Rekursion und StackOverflow Allgemeine Java-Themen 11
P Stackoverflow in Rekursion. Bin ich schuld oder Java? Allgemeine Java-Themen 9
nico3000 Rekusrion mit Stackoverflow Allgemeine Java-Themen 7
0 StackOverflow abfangen Allgemeine Java-Themen 15
I Vector serialisieren: StackOverflow Allgemeine Java-Themen 13
berserkerdq2 Weiß jemand wie ich im Scenebuilder das Fenster so darstellen kann, dass beim Vollbildmodus die Objekte so angezeigt werden? Allgemeine Java-Themen 1
C Probleme beim Erstellen eines runnable-jar files Allgemeine Java-Themen 1
B Mysteriöse Ergebnisse beim Baccarat Programm? Allgemeine Java-Themen 13
8u3631984 Problem beim Mocken von Record Klassen Allgemeine Java-Themen 4
A Zweite Service Klasse beim Kompilieren Allgemeine Java-Themen 6
B Java Reflection Probleme beim wehcselseitigen Referenzieren zweier Klassen/Objekte Allgemeine Java-Themen 14
B Stringmanipulationen beim Dateinamen Allgemeine Java-Themen 8
B Woher kommen die Bildschirmkoordinaten beim java Robot? Allgemeine Java-Themen 14
Alex_99 Programm stürzt beim Aufruf der Funktion ab? Text ausgeben Allgemeine Java-Themen 45
J Mein Frame friert ein beim Uploaden Allgemeine Java-Themen 4
P Selenium Scriipt zeigt Fehler beim Import Allgemeine Java-Themen 3
A Hilfe beim Verständnis Allgemeine Java-Themen 16
stormyark Problem beim Klassen erstellen Allgemeine Java-Themen 1
K Verbesserung der Laufzeit beim Sortieren von Einwohnern nach ihrem Geburtsjahr Allgemeine Java-Themen 0
B Compiler-Fehler Probleme beim Kompilieren mit Jsoup Allgemeine Java-Themen 8
G javamail Problem beim Empfangen von Nachrichten Allgemeine Java-Themen 3
yakazuqi Fehler beim Laden. JDA (Java Discord API) Allgemeine Java-Themen 1
T Problem beim Umwandeln in eine Jar-Datei Allgemeine Java-Themen 3
W Suche Ursache für NPE - woher kommt sie? (Hilfe beim Debugging) Allgemeine Java-Themen 19
U Fehler beim Compillieren Allgemeine Java-Themen 13
B neuroph hält beim XOR lernen nicht an Allgemeine Java-Themen 13
bueseb84 Fehler beim Import von Maven Dependencies aus lokalem artifactory Allgemeine Java-Themen 2
J Jasper Report - seltame Meldung beim compilieren Allgemeine Java-Themen 3
J Linux .jar beim Start automatisch ausführen Allgemeine Java-Themen 6
T String-Manipulation beim Ablauf in Eclipse und als JAR-File Allgemeine Java-Themen 8
V Threads Probleme beim Aufrufen von Methoden einer anderen Klasse (Threads) Allgemeine Java-Themen 14
M Gibt es eine API die den aktuellen Wert eines Indikators beim Trading zurückgibt? Allgemeine Java-Themen 7
A Fehler beim Öffnen eines Projekts Allgemeine Java-Themen 6
L Compiler-Fehler Generics beim Anhängen von Predicates Allgemeine Java-Themen 1
J WARNING: An illegal reflective access operation has occurred, beim Compilieren von JasperReports, was bedeutet das ? Allgemeine Java-Themen 23
J Problem beim Umstellen auf Java jdk 13 Allgemeine Java-Themen 3
A Problem beim öffnen von Java-Installern Allgemeine Java-Themen 1
J Problem beim Generischen Klassen und Interfaces Allgemeine Java-Themen 2
C Fehler beim Debuggen von Listen Allgemeine Java-Themen 4
L File beim Kopieren in einen anderen Ordner umbenennen Allgemeine Java-Themen 6
B Input/Output Probleme beim Ausführen von Shell-Befehlen mit Java Allgemeine Java-Themen 28
J Probleme beim einbinden von Zip4j library Allgemeine Java-Themen 6
T Compiler-Fehler NoClassDefFoundError beim Laden einer Class Allgemeine Java-Themen 11
S Seitenausrichtung beim Drucken Allgemeine Java-Themen 1
RalleYTN Brauche Hilfe beim Run-Length-Decoding Allgemeine Java-Themen 9
R Optimierung beim Vergleichen von 2 Bildern Allgemeine Java-Themen 23
F SQLite mit Java / Probleme beim INSERT Befehl Allgemeine Java-Themen 4
I Fehler beim Ant-Package erstellen mit Java 9 Allgemeine Java-Themen 1
S Eclipse Probleme beim Implementieren / Ausführen von jUnit 5-Test Suites Allgemeine Java-Themen 14
M Beim Öffnen Dialog Directory und Filetype definieren Allgemeine Java-Themen 2
G Problem beim GUI Allgemeine Java-Themen 9
A Probleme beim Verstehen einer Aufgabenstellung Allgemeine Java-Themen 11
A OOP Problem beim Berechnen der größten Fläche eines Ringes Allgemeine Java-Themen 19
F Problem beim Einlesen einer Textdatei Allgemeine Java-Themen 12
J Konstruktor in JSP beim Kompilieren nicht gefunden Allgemeine Java-Themen 3
perlenfischer1984 Probleme beim Mocken Allgemeine Java-Themen 6
A Fehler beim Aktualisieren JTable Allgemeine Java-Themen 1
D Pivot-Wahl beim QuickSort steigert die Effizienz, eine Lüge??? Allgemeine Java-Themen 17
J-Gallus Erste Schritte Wahrscheinlich Anfänger Fehler beim rechnen. Falsches Ergebnis. Allgemeine Java-Themen 9
U Swing Hilfe beim Quellcode für ein Codierungs-/Decodierungsprogramm Allgemeine Java-Themen 9
Fischkralle Beim Clean Coden an den Schnittstellen geschnitten. Allgemeine Java-Themen 10
H Beim Konstruktor "this" Allgemeine Java-Themen 4
I Problem beim Aufrufen, von Objektmethoden/ -variablen Allgemeine Java-Themen 6
J Interpreter-Fehler Fehler beim Verschlüsseln Invalid AES key length Allgemeine Java-Themen 1
R probleme beim starten von jar unter linux Allgemeine Java-Themen 2
Thallius Swing Merkwürdiges Verhalten beim Panel Tausch Allgemeine Java-Themen 3
Tacofan Sound beim öffnen der GUI Allgemeine Java-Themen 8
Z NullPointerException beim Schreiben einer ArrayList in eine Datei Allgemeine Java-Themen 6
B Endlosschleife beim Verteilen von Objekten Allgemeine Java-Themen 4
V JavaFX Fehler beim Starten einer Jar Allgemeine Java-Themen 7
B Fortschritt beim Schreiben einer Datei ausgeben lassen Allgemeine Java-Themen 7
J JDK installieren Das Jdk funtioniert beim Editor nicht. Allgemeine Java-Themen 3
R Verdrückt beim Sicherheitshinweis Allgemeine Java-Themen 2
M Probleme beim rechnen, bei Zahlen mit führenden Nullen. Allgemeine Java-Themen 7
javampir Input/Output Effizienz beim binären Lesen einer Datei Allgemeine Java-Themen 6
javampir Seltsame Lücken beim Abspielen von Sound Allgemeine Java-Themen 2
RalleYTN JAnsi Warum bleiben die Hintergrundfarben beim Reseten der Konsole? Allgemeine Java-Themen 0
T BufferedImage verändert sich beim Einlsesen Allgemeine Java-Themen 1
E JCuda-0.6.5 Probleme beim ausführen der Datei Allgemeine Java-Themen 0
S Verständnisproblem beim Mocking Allgemeine Java-Themen 8
W JNDI - LDAP - Probleme beim editieren von Usern Allgemeine Java-Themen 0
Athena Programm funktioniert nur beim Debugging korrekt, sonst nicht. Allgemeine Java-Themen 1
N Zahlensysteme umrechnen; Probleme beim Umwandeln Allgemeine Java-Themen 4
K Fehler beim erstellen von .jar Datei Allgemeine Java-Themen 3
M Eclipse Fehler beim Installieren des Plugins "Jigloo" Allgemeine Java-Themen 12
A Eclipse - Fehler beim "RUN" - "Unable to Launch - The selection cannot be launched" Allgemeine Java-Themen 6
G StackoverflowError beim laden einer FXMML Datei Allgemeine Java-Themen 1
L Methoden Methode gibt mir beim verschlüsseln mit RSA 0 bytes aus ? Allgemeine Java-Themen 1
D Selenium WebDriver HtmlUnitDriver Problem beim Automatisieren Allgemeine Java-Themen 1
A Probleme beim auslesen von Quelltext (HTML) Allgemeine Java-Themen 5
D Input/Output Zeilen werden "ignoriert" beim Einlesen aus einer Textdatei Allgemeine Java-Themen 3
L Suchvorschläge beim eingeben einzelner Buchstaben Allgemeine Java-Themen 3

Ähnliche Java Themen

Neue Themen


Oben