Bildvergleich mit php + gd

9

Was ist der beste Ansatz, um zwei Bilder mit PHP und der Graphic Draw (GD) Bibliothek zu vergleichen? >?

Dies ist das Szenario:

Alternativtext http://img262.imageshack.us/img262/4849/imagecomparison.jpg

Ich habe ein Bild, und ich möchte herausfinden, welches Bild eines bestimmten Sets ihm am ähnlichsten ist. Das ähnlichste Bild ist in der Tat das gleiche Bild, nicht pixelgenau, aber das gleiche Bild. Ich habe den Unterschied zwischen den beiden Bildern mit der Nummer eins in dem Beispiel dramatisiert, nur um das Verständnis dessen, was ich meinte, zu erleichtern.

Obwohl es keine konsistenten Ergebnisse brachte, bestand mein Ansatz darin, die Bilder auf 1px zu reduzieren, indem ich imagecopyresampled Funktion und sehen Sie, wie nahe die RGB-Werte zwischen den Bildern sind.

Die Summe der Werte, die jeden roten, grünen und blauen dezimalen Äquivalenzwert von dem Rot-, Grün- und Blau-Dezimaläquivalentwert der möglichen Übereinstimmung abzogen, gab mir einen Unähnlichkeitsindex, der, obwohl er seither nicht wie erwartet funktionierte nicht immer Das am meisten RGB-ähnliche Bild war das Zielbild, mit dem ich ein Bild aus den verfügbaren Zielen auswählen könnte.

Hier ist ein Beispiel der Ausgabe, wenn 4 Bilder mit einem Zielbild verglichen werden, in diesem Fall das Apple-Logo, das mit einem von ihnen übereinstimmt, aber nicht genau dasselbe ist:

Originalbild:

Ссылка Rot: 222 Grün: 226 Blau: 232

Gegenüber:

Ссылка Rot: 183 Grün: 212 Blau: 212 und ein Ähnlichkeitsindex von 56

Ссылка Rot: 117 Grün: 028 Blau: 028 und ein Unähnlichkeitsindex 530

Ссылка Rot: 218 Grün: 221 Blau: 221 und ein Unähnlichkeitsindex 13 Richtig abgestimmt.

Rot: 061 Grün: 063 Blau: 063 und ein Unähnlichkeitsindex 491

Vielleicht ist es gar nicht besser machbar mit besseren Ergebnissen als das, was ich schon bekomme und ich verschwende meine Zeit hier, aber da es eine Menge erfahrener PHP-Programmierer zu geben scheint, kann man mich in die richtige Richtung lenken wie man das verbessert.

Ich bin offen für andere Bildbibliotheken wie iMagick , Gmagick oder Kairo für PHP, aber ich würde es vorziehen, andere Sprachen als PHP zu verwenden.

Vielen Dank im Voraus.

    
johnnyArt 10.01.2010, 14:03
quelle

3 Antworten

4

Ich hätte gedacht, dass Ihr Ansatz vernünftig erscheint, aber ein ganzes Bild auf 1 x 1 Pixel zu verkleinern, ist wahrscheinlich ein Schritt zu weit.

Wenn Sie jedoch jedes Bild auf die gleiche Größe konvertiert haben und dann die durchschnittliche Farbe in jedem 16x16 (oder 32x32, 64x64 usw., abhängig von der Verarbeitungszeit / Leistung, die Sie verwenden möchten) berechnet haben, sollten Sie in der Lage sein eine Art vernünftigen (-ischen) Vergleich zu bilden.

    
John Parker 10.01.2010, 14:26
quelle
0

Ich würde vorschlagen, wie Middaparka, dass Sie nicht auf ein 1-Pixel-Bild herunterrechnen, weil Sie alle räumlichen Informationen verlieren. Downsampling zu 16x16 (oder 32x32, etc.) würde sicherlich bessere Ergebnisse liefern.

Dann kommt es auch darauf an, ob Farbinformationen für Sie wichtig sind oder nicht. Von dem, was ich verstehe, könnten Sie tatsächlich darauf verzichten und ein Grauwertbild ausgehend von Ihrem Farbbild (z. B. Luma) berechnen und die Kreuzkorrelation berechnen. Wenn, wie Sie sagten, es ein paar Bilder gibt, die genau übereinstimmen (außer Farbinformationen), sollte Ihnen dies eine ziemlich gute Zuverlässigkeit geben.

    
NeXuS 10.01.2010 22:39
quelle
-1

Mit Middparkas Methoden können Sie jedes Bild in eine Folge numerischer Werte umwandeln und dann Levenshtein verwenden Algorithmus um die beste Übereinstimmung zu finden.

    
Bart van Heukelom 10.01.2010 15:16
quelle