Frage

habe ich einen BufferedImage vom Typ TYPE_INT_BGR. Ich brauche einen Pixel-für-Pixel-Vergleich zu anderen BufferedImage zu tun, um die „Distanz“ zwischen den beiden Bildern zu berechnen. Ich habe etwas, das funktioniert, ist aber langsam. Ich bekomme ein Pixel aus dem „Referenz“ Bild, es löst sich in RGB-Bytes mit:

    int pixel = referenceImage.getRGB(col, row);
    int red   = (pixel >> 16) & 0xff;
    int green = (pixel >> 8) & 0xff;
    int blue  = (pixel) & 0xff;

Vergleichen I in der R / G / B-Werte an die entsprechenden Pixel des Kandidatenbild, und die Quadrate der Differenzen summieren.

Gibt es einen schnelleren Weg, um diese Art von Vergleich zu tun? Spähen in die JRE Quelle, ich sehe, dass BufferedImage.getRGB () tatsächlich ODER-Verknüpfung der konstituierenden RGB-Werte aus dem Raster zusammen, die für meine Zwecke verschwenderisch ist, da ich es bin nur brechen wieder in Bytes nach unten.

Ich werde tun, dass direkt versuchen, aber ich frage mich, ob es nicht ein besserer Weg, dies zu tun, entweder über eine Java oder 3rd-Party-API, dass ich vielleicht übersehen hat.

War es hilfreich?

Lösung

Daten von einem VolatileImage Lesen nicht schneller sein. Was macht VolatileImages „schneller“ ist, dass sie beschleunigt verwenden (VRAM) Speicher statt System (RAM) Speicher für Bilder zeichnen. Wenn jedoch eine Lese tun, es den Zugriff auf Speicher über einen anderen Bus benötigen und ist langsamer als Systemspeicher für diese Vorgänge.

Der schnellste Weg BufferedImages zu vergleichen wäre integer Vergleiche zu verwenden, um die Art und Weise Sie in Ihrem Beitrag zu diskutieren, aber wie Sie erwähnen Sie nicht getRGB aus Performance-Gründen verwenden können. Sie können einen Stapel von Pixeln in ein Array erhalten, aber alles in allem sollten Sie wahrscheinlich nur Einblick in das Raster und Databuffer für die Leistung.

Andere Tipps

Wenn beide Bilder das gleiche Farbmodell und Probenahme verwenden, können Sie Ihren Vergleich auf dem Databuffer des Rasters durchführen, die ein wenig schneller sein wird.

Haben Sie mit Java2D als ein neues Bild ist die Unterschied zwischen den beiden Bildern, die Sie haben, zu erstellen und dann das Differenzbild analysieren statt?

Mein erster Ansatz wäre das Negativ der Bild A nimmt und Bild B hinzuzufügen.

Wenn auf Bytes Abbau + Laden zusätzliche Klassen ist das Problem, versuchen Sie dies:

Erhalten der BufferedImage Wert Form eines RGB-Pixelwert

img = 65536*R + 256*G + B - 16777216;  

Wie Sie einen RGB-Wert von einem BufferedImage Wert img

R=  Math.round((((371*img)+24576000000) / 96000000)
G=  Math.round((65536 + 0.003906*img - 256*R));
B=  Math.round((65536*R + 256*G -img - 16777216));

Ich bin nicht sicher, ob dies ein besserer / schnellerer Weg, es zu tun, aber es ist ein andere alternative Methode, die keine zusätzliche Klassen nicht verwendet, und ist ein gerade Mathe-Prozess (oder ein Hack) ... Diese werden kann nützlich bei einigen Gelegenheiten (Prüfe, da es meine eigene Methode ist, dass ich nicht genug Zeit haben zu spielen hat).

Ich weiß nicht, über die Art des Vergleichs Sie zwischen den Pixelwerten benötigt, so ist dies, wie weit dieser Beitrag geht ... Ich hoffe, dass jemand tatsächlich findet diese Informationen hilfreich!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top