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?
 

Marco13

Top Contributor
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")
 

Dumdidum

Mitglied
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.
 

Dumdidum

Mitglied
(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:

Marco13

Top Contributor
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.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
I Arbeitsspeicherverbrauch BufferedImage.TYPE_INT_RGB vs. TYPE_3BYTE_BGR AWT, Swing, JavaFX & SWT 6
H BufferedImage zurücksetzen funktioniert nicht AWT, Swing, JavaFX & SWT 12
L AWT Ändern der Farbe eines BufferedImage mit Farbähnlichkeit AWT, Swing, JavaFX & SWT 5
I GEmaltes BufferedImage löschen AWT, Swing, JavaFX & SWT 3
cool_brivk24 BufferedImage einem ClickEvent hinzufügen AWT, Swing, JavaFX & SWT 13
cool_brivk24 AWT BufferedImage wird nicht geladen AWT, Swing, JavaFX & SWT 17
J linken Bildausschnitt eines BufferedImage abschneiden AWT, Swing, JavaFX & SWT 4
Zar von Domarus JFrame zu BufferedImage konvertieren AWT, Swing, JavaFX & SWT 3
S 2D-Grafik User-BufferedImage rotieren im Zentrum und ohne "anpassung" AWT, Swing, JavaFX & SWT 2
C Pixel-Rendering/Animation Performance in BufferedImage AWT, Swing, JavaFX & SWT 1
H Swing BufferedImage zeichnen AWT, Swing, JavaFX & SWT 1
C Swing BufferedImage zeichnen und JLabels setzen. AWT, Swing, JavaFX & SWT 17
G Subimage von BufferedImage speichern AWT, Swing, JavaFX & SWT 4
D JPanel Graphic2D als BufferedImage Speichern AWT, Swing, JavaFX & SWT 5
I 2D-Grafik Shape aus BufferedImage "löschen" AWT, Swing, JavaFX & SWT 2
M 2D-Grafik LookupOp Operation auf BufferedImage AWT, Swing, JavaFX & SWT 7
GianaSisters 2D-Grafik BufferedImage.getSubimage - Frage AWT, Swing, JavaFX & SWT 7
P BufferedImage schlechte Qualität beim Abspeichern AWT, Swing, JavaFX & SWT 9
S BufferedImage als schwarz-weiß-Bild AWT, Swing, JavaFX & SWT 3
Luk10 BufferedImage[...].getData() vs BufferedImage.setRGB() AWT, Swing, JavaFX & SWT 2
D Schnelles kopieren von Pixeln in ein BufferedImage AWT, Swing, JavaFX & SWT 25
J Flackern wie mit BufferedImage beheben AWT, Swing, JavaFX & SWT 4
N Swing BufferedImage neu laden AWT, Swing, JavaFX & SWT 10
N 2D-Grafik BufferedImage, Line2D, Swing und die Probleme AWT, Swing, JavaFX & SWT 5
Luk10 BufferedImage auf ein anderes BufferedImage zeichnen AWT, Swing, JavaFX & SWT 6
P BufferedImage auf JPanel AWT, Swing, JavaFX & SWT 11
K 2D-Grafik BufferedImage eingelesen, welches Modell?! AWT, Swing, JavaFX & SWT 2
T BufferedImage bei paintComponent AWT, Swing, JavaFX & SWT 6
C 2D-Grafik BufferedImage laden, Frage zum Code AWT, Swing, JavaFX & SWT 2
0x7F800000 2D-Grafik int[] zu BufferedImage konvertieren AWT, Swing, JavaFX & SWT 27
H 2D-Grafik BufferedImage aus Integer-Array AWT, Swing, JavaFX & SWT 3
Luk10 2D-Grafik BufferedImage sauber rotieren AWT, Swing, JavaFX & SWT 16
P Image mehrfach in ein BufferedImage zeichnen AWT, Swing, JavaFX & SWT 7
A BufferedImage nach dem Speichern immer schwarz AWT, Swing, JavaFX & SWT 8
J Bild aus Datei in BufferedImage laden AWT, Swing, JavaFX & SWT 4
E BufferedImage Alphaknal ein- und ausblenden AWT, Swing, JavaFX & SWT 7
N BufferedImage zeichnen AWT, Swing, JavaFX & SWT 4
D BufferedImage Größe skalieren AWT, Swing, JavaFX & SWT 2
P Swing Vom BufferedImage bei paintComponent nur soviel zeichnen, wie nötig AWT, Swing, JavaFX & SWT 3
B 2D-Grafik BufferedImage Performance AWT, Swing, JavaFX & SWT 3
Y frage zu BufferedImage AWT, Swing, JavaFX & SWT 7
E AWT RenderedImage aus BufferedImage erzeugen, um Bild abzuspeichern? AWT, Swing, JavaFX & SWT 4
S Unterscheiden ob ein Graphics-Objekt von einer JComponent oder einem BufferedImage kommt..? AWT, Swing, JavaFX & SWT 4
A 2D-Grafik BufferedImage wird nicht eingezeichnet AWT, Swing, JavaFX & SWT 3
G 2D-Grafik BufferedImage Hintergrund immer schwarz AWT, Swing, JavaFX & SWT 4
Developer_X Swing Auf ein BufferedImage mit Graphics/Graphics2D zeichnen AWT, Swing, JavaFX & SWT 6
J AWT BufferedImage to 2DArray AWT, Swing, JavaFX & SWT 10
R Bild drehen UND skalieren (Image bzw BufferedImage) AWT, Swing, JavaFX & SWT 5
J JPanel in Bufferedimage AWT, Swing, JavaFX & SWT 3
1 BufferedImage in byte[], dann in String und zurück AWT, Swing, JavaFX & SWT 7
J Swing paintComponent() - repaint() - BufferedImage anzeigen AWT, Swing, JavaFX & SWT 5
C BufferedImage-Fehler? Falsches Bild wir gezeichnet AWT, Swing, JavaFX & SWT 5
B BufferedImage Builder AWT, Swing, JavaFX & SWT 15
F Transparentes BufferedImage über BufferedImage AWT, Swing, JavaFX & SWT 12
F Größe von BufferedImage ändern AWT, Swing, JavaFX & SWT 27
I Swing JComponent als BufferedImage speichern AWT, Swing, JavaFX & SWT 18
Dragonfire Swing Zoom-Vorgang optimieren [BufferedImage] AWT, Swing, JavaFX & SWT 2
2 Memory Leak mit BufferedImage !! AWT, Swing, JavaFX & SWT 15
X BufferedImage maximiert in JFrame anzeigen? AWT, Swing, JavaFX & SWT 2
R JPanel - BufferedImage - zeichnen großer Bilder AWT, Swing, JavaFX & SWT 2
R JTable - TableCellRenderer - BufferedImage AWT, Swing, JavaFX & SWT 9
D BufferedImage und Graphics2D AWT, Swing, JavaFX & SWT 3
R Zeichnen von Zahlen in BufferedImage AWT, Swing, JavaFX & SWT 6
G BufferedImage.getRGB() mit 3 int-Werten vergleichen AWT, Swing, JavaFX & SWT 2
Luma BufferedImage wird nicht gezeichnet AWT, Swing, JavaFX & SWT 3
G keine ScaledInstance von BufferedImage? AWT, Swing, JavaFX & SWT 6
S BufferedImage & Scaling: Altes Problem im neuen Gewand AWT, Swing, JavaFX & SWT 2
G zu viele/große BufferedImage führt zu Java heap space AWT, Swing, JavaFX & SWT 5
G BufferedImage und jpg --> maximale Qualität AWT, Swing, JavaFX & SWT 9
F HTML Text irgendwie auf BufferedImage bringen AWT, Swing, JavaFX & SWT 3
R BufferedImage Problem AWT, Swing, JavaFX & SWT 2
G Problem mit BufferedImage und imageIO AWT, Swing, JavaFX & SWT 2
S BufferedImage drehen AWT, Swing, JavaFX & SWT 3
? ActionListener auf BufferedImage AWT, Swing, JavaFX & SWT 11
M BufferedImage mit html interpretierten String beschriften AWT, Swing, JavaFX & SWT 3
A Probelme mit großen BufferedImage in paintComponent AWT, Swing, JavaFX & SWT 7
B Farbtiefe eines BufferedImage verringern AWT, Swing, JavaFX & SWT 3
F ImageIcon -> BufferedImage AWT, Swing, JavaFX & SWT 2
T Performance Problem bei BufferedImage AWT, Swing, JavaFX & SWT 3
F Animiertes Gif als BufferedImage AWT, Swing, JavaFX & SWT 10
L Anzeigen von fotos: ImageIcon oder BufferedImage + paint() ? AWT, Swing, JavaFX & SWT 5
C Rotate BufferedImage --> Bild unvollständig AWT, Swing, JavaFX & SWT 5
U Streifen hinter bewegtem BufferedImage AWT, Swing, JavaFX & SWT 13
M BufferedImage skalieren AWT, Swing, JavaFX & SWT 6
T BufferedImage verkleinern Resultat ist zu pixelig. AWT, Swing, JavaFX & SWT 6
G Image Object speichern oder in ein BufferedImage umwandeln AWT, Swing, JavaFX & SWT 2
P Problem beim Zeichnen auf ein BufferedImage AWT, Swing, JavaFX & SWT 4
B BufferedImage aus einer Datei AWT, Swing, JavaFX & SWT 4
C Farben in BufferedImage ändern ? AWT, Swing, JavaFX & SWT 2
J Image to BufferedImage AWT, Swing, JavaFX & SWT 5
T BufferedImage kopieren AWT, Swing, JavaFX & SWT 3
T BufferedImage Farbe "Transparent" AWT, Swing, JavaFX & SWT 21
T BufferedImage + bestimmten bereich ausfüllen AWT, Swing, JavaFX & SWT 3
M BufferedImage Größe? AWT, Swing, JavaFX & SWT 10
U Löschen eines BufferedImage AWT, Swing, JavaFX & SWT 7
J Image aus BufferedImage ohne AWT AWT, Swing, JavaFX & SWT 5
V Image in BufferedImage AWT, Swing, JavaFX & SWT 3
J BufferedImage aus byte-Array erstellen AWT, Swing, JavaFX & SWT 3
S AWT AWT.List bug oder feature AWT, Swing, JavaFX & SWT 4
lumo SWT Bug oder Feature? AWT, Swing, JavaFX & SWT 8

Ähnliche Java Themen

Neue Themen


Oben