BufferedImage -> Feature Extraktion. Unterschiedliche BufferedImage imageTypes problem

Dumdidum

Mitglied
Hallo ihr Lieben.

Ich bin gerade dabei mit Hilfe einer Library einen einfachen Bilder-Ähnlichkeits Berechner zu proggen.
Hierfür habe ich Bilder in unterschiedlichen Formaten.

Falls ich:

Java:
BufferedImage b = ImageIO.read(file);
System.out.println(b.getType());

mache, werden wohl automatisch TYPE_3BYTE_BGR oder TYPE_BYTE_GRAY verwendet.

Allerdings habe ich auch eine kleine Zeichnungskomponente in dem man ein Bild laden und eben auch verändert werden kann. Hierbei habe ich TYPE_INT_ARGB verwendet, da ich aus verschiedenen Gründen auch einen Alpha Wert brauche und normalerweise halt auch sonst standardmäßig immer irgendwie TYPE_INT_RGB nehme. Ehrlich gesagt hab ich mir über die typen bei einem BufferedImage nie Gedanken gemacht.

Das Problem ist nun folgendes:
Ich habe Features (ColorHistogram) auf mehrere Bilder berechnet (die durch JavaIO.read(file) automatisch zu TYPE_3BYTE_BGR oder TYPE_BYTE_GRAY) wurden. Diese werden mit einem Bild dessen Feature in TYPE_INT_RGB berechnet wurden und das führt dazu, dass andere Bilder als ähnlicher gehalten werden wie das "identische", das sich auch in den vorberechenten Features befindet.

Folglich schließe ich daraus, dass ich alle Feature Berechnungen wohl auf den gleichen Typ machen sollte. Deshalb wandle ich halt jetzt alle BufferedImages vor der Feature-Berechnung um, wenn sie einen anderen TYP haben:

Java:
	public static BufferedImage getTransferedBufferedImage(BufferedImage start) {
		if (start.getType() == BufferedImage.TYPE_INT_RGB) {
			return start;
		} else {
			BufferedImage result = new BufferedImage(start.getWidth(), start.getHeight(), BufferedImage.TYPE_INT_RGB);
			result.getGraphics().drawImage(start,0,0,null);
			return result;
		}
	}

Meine Fragen:
1.) Gäbe es für mich einen alternativen Weg?
2.) Da ich mich überhaupt nicht mit den BufferedImage Typen auskenne. Gibt es irgendwo eine Anleitung was man wann verwenden soll? In den meisten Beispielen wird ja immer BufferedImage.TYPE_INT_RGB verwendet.
3.) Kann auch ein Bild gleich in TYPE_INT_RGB geladen werden? Anstelle ImageIO.read() entscheiden zu lassen und es dann von Hand um zu wandeln?
 
Die Frage, welchen Typ das Bild hat, wenn man es mit ImageIO lädt, hängt von vielen verschiedenen Faktoren ab. Irgendein GIF hat vielleicht 3-byte-RGB, vielleicht aber auch ARGB, wenn es Transparenz enthält. Ein Bild eines Formates, das dediziert Graustufen unterstützt (TIFF oder so...?) würde vielleicht GRAY haben. Das Problem: Ein PNG hat auch öfter mal TYPE_CUSTOM, womit man so gesehen nicht viel anfangen kann.

Den Typ bei ImageIO direkt festlegen geht nicht. Wenn man "eine Ebene tiefer" ansetzt, mit ImageReader & Co, könnte man vielleicht einen gewissen Einfluß haben, aber das bezweifle ich auch. Das Bild ggf. in das gewünschte Format zu konvertieren ist aus verschiedenen Gründen nicht unüblich (siehe auch http://www.java-forum.org/spiele-mu...18-performance-bufferedimages.html#post878295 ).

Etwas verwundert mich das eigentliche Problem aber doch: Wenn man bei einem Bild mit image.getRGB(x,y) einen Pixel abholt, sollte das interne Format egal sein. Ein Roter Pixel sollte 0xFFFF0000 sein, egal er von einem ARGB oder 3BYTE-Bild kommt. Etwas anderes wäre, wenn du (z.B. auch aus Performancegründen) genau diese Umrechnung vom internen Format in das ARGB von getRGB vermeiden wolltest, und genau deswegen den Typ brauchst: Um direkt auf die internen Daten zugreifen zu können. (Das könnte ggf. deutlich schneller sein, aber siehe auch die Anmerkungen im verlinkten Thread zu "managed images")
 
Ja ehrlich gesagt verwundert mich das Problem auch. Hätte nämlich auch erwartet dass der Typ des BufferedImages egal sein sollte. Allerdings hatte ich dann eben den Effekt, dass er mir das identische Bild als ähnlichstes zurückgibt, wenn ich es direkt nach dem Einlesen als Anfrage-Bild benutze. Wenn ich es davor aber auf ein BufferedImage des TYPE_INT_RGB male, hatte ich ein komplett anderes Ergebnis.

Ich bin mir ehrlich gesagt auch eben nicht sicher ob das vllt einfach nen Problem der Library ist. Da hab ich aber auch mal nachgefragt.
 
(Kann das sein, dass man nach einer bestimmten Zeit nicht mehr editieren kann?)

Inzwischen hab ich Rückmeldung von einem der die Library betreut. Und für ihn ist das auch neu, dass es hierbei zu Problemen kommen kann. Jetzt ist nur die Frage ob es an mir liegt, Problemen bei der Library oder, dass es einfach so ist.. :/


EDIT: vllt bin ich es. Nen Test in ner extra Klasse hat das Problem erst mal nicht bestätigt...
EDIT2: weil der Test falsch war.. jetzt habe ich wieder das Problem 🙁


EDIT3:
Ich hab nen kleinen Test gemacht. Und anscheined tritt das Problem nur bei den als TYPE_BYTE_GRAY geladenen Bildern auf. Ob TYPE_3BYTE_BGR oder TYPE_INT_RGB scheint wohl doch kein Problem zu machen.

Jemand ne Idee was der Grund hierfür ist?
 
Zuletzt bearbeitet:
Bei der Umwandlung auf RGB kann natürlich ein A verloren gehen, und die Bilder gelten dann ggf. als unterschiedlich. Bei einem GREY würde das aber nicht passen. Was genau sind die Unterschiede? Ggf. mal ein KSKB und zwei (kleine, 10x10 Pixel reichen!) Testbilder hochladen.
 

Zurück
Oben