• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

Ähnliche Bilder suchen

RME

Advanced Hacker
Hallo,

Ich habe mal versucht im Internet ähnliche Bilder zu einem auf meinem Rechner gespeicherten zu suchen (Google: "search similar images"). Es gibt offenbar noch nicht viele Möglichkeiten dies zu tun -- ist aber offenbar etwas was im kommen ist.

Beispiel:

Ich habe das KDE Maskottchen von http://www.linux-club.de (das KDE Konqi) auf GazoPa (http://www.gazopa.com) "upgeloaded" und, siehe da, es gab viele gleiche und ähnliche Images als Antwort.

Hier ist das "upload" Image:

>>> upload <<<

und hier die erste Seite des Such-Resultats:

>>> search Resultat <<<

----------

Fragen:

-1- Hat jemand Erfahrung mit "search similar images"? Was ist zur Zeit die beste Anwendung (Google kann dies noch nicht mit uploaded Images).

-2- Gibt es eine Webseite wo das verwendete Verfahren erklärt wird? Wie wird das upgeloadete Image analysiert und wie werden (in real-time) ähnliche Images gefunden?

-3- Gibt es gar irgendwelche Open-Source Anwendungen auf diesem Gebiet?

Gruss,
Roland
 
A

Anonymous

Gast
Ist ein sehr spannendes Thema, Es gibt da eine ganze Reihe unterschiedlicher Methoden. Ich habe mich mal eine zeitlang damit in Scripten befasst. Habe dabei mit ImageMagick, genauer mit compare gearbeitet.
Gebraucht habe ich das damals um Videos zu stabislieren, also die Verwackelungen zu entfernen. Heute verwende ich dafür den stabilize Filter von transcode.

Also um zB auf deiner Festplatte gleiche Bilder zu finden, unabhängig von ihrem Format, der Größe, der Kompressionsverluste und dem Verarbeitungsgrad der Bilder müsstest du in der ersten Stufe erstmal die Bilder die du auf mögliche Verwandschaft überprüfen willst erstmal auf eine gleiche Größe und gleiches Format bringen. Wir gehen jetzt mal davon aus, die Bilder sind nicht beschnitten gedreht oder sonstwie massiv im Motiv verändert worden, Diese Größe sollte ziemlich klein sein, jedenfalls <= dem kleinsten Einzelbild, damit werden dann schon Einzelheiten und einige induviduelle Unterschiede die bei der Verarbeitung der einzelnen Bilder dazugekommen sind ausgeschlossen und das Bild im Wesentlichen auf Farbe und Kontrast und Konturen beschränkt. Hier könntest du auch schon entscheiden, dass es dir eigentlich um das Motiv geht, und du mit Graustufen weiterarbeiten willst, also zB massive Farbverschiebungen oder Änderungen außter Acht lassen willst. Das ist alles noch recht einfach.

Danach kannst du dann compare anwenden. Allerdings das Ergebniss ist erstmal wieder nur ein Bild (genauer gesagt das Diffenzbild) von dem man mehr oder weniger genau die Differenzen erkennen könnte. Um das automatisch mathematisch vergleichen zu können kann man im nächsten Schritt dann dieses Diffenzbild mit identify auswerten und das Ergebnis filtern und dort mit den Zahlen weiterrechnen.

Als Zwischenschritt zB sowas hier
Code:
convert bild0530.jpg bild0840.jpg -compose Difference -composite miff:- | identify -verbose - | sed -n '/statistics:/,/^  [^ ]/ p'
Mit welchem Wert du jetzt weiterarbeiten kannst oder willst am Besten bei ImageMagic mal nachlesen.

Mal so als kleines Beispiel was man damit anfangen könnte. folgendes kleine Script
Code:
#!/bin/bash
convert "$1" -resize '128!x128!' tmp_org.png
for BILD in "$@"
    do
    convert "$BILD" -resize '128!x128!' tmp_comp.png
    DIFF=$(convert tmp_org.png tmp_comp.png -compose difference -composite -colorspace gray miff:- | identify -verbose - |\
        sed -n '/^.*mean: */{s//scale=2;/;s/(.*)//;s/$/*100\/32768/;p;q;}' | bc)
    echo -e "$DIFF \t\t $BILD"
done
Zur Benutzung des Scripts: der erste Parameter ein einzelnes Bild der zweite Parameter können mehrere Bilder sein die mit dem ersten verglichen werden. Ergebnis ist eine Liste der Bildernamen, und der Ähnlichkeit in Form eines Wertes. je weiter sich dieser Wert 0 nähert um so ähnlicher ist das Bild.
in der ersten Zeile wird das erste Bild selbst überprüft das muss natürlich 0 sein. (Achtung es werden 2 temporäre PNG-Bilder im aktuellen Verzeichnis angelegt und vom Script selbst nicht wieder gelöscht) (Achtung:: bei einigen Versionen muss in der sed-Befehlszeile das "mean" vorne Groß geschrieben sein. also "sed -n '/^.*Mean:..............." )

Beispielausgabe:
Code:
rob@rob-linux:~> comp.sh Bilder/cimg1439.jpg ./.thumbnails/normal/*.png
0                Bilder/cimg1439.jpg
.39              ./.thumbnails/normal/0389517b254668eab8bc7bfc210e8ddd.png
.27              ./.thumbnails/normal/0458316339b11ebc3cb6a23d6e0c49e7.png
.23              ./.thumbnails/normal/06b32c11d9869ebcc11241f8157f3c57.png
.21              ./.thumbnails/normal/096bc1267ee66365cb26811bda4e8ce7.png
.31              ./.thumbnails/normal/0a65a167491e4fad5419520cf0610139.png
.24              ./.thumbnails/normal/0aef1cad2a2130cdc562f12f0b00e0ab.png
.28              ./.thumbnails/normal/0dd254b5e7c848471cd5f1dfdf903f6b.png
.28              ./.thumbnails/normal/155a68e6fa1973e7e50fcd99a67efe7c.png
.24              ./.thumbnails/normal/18bba6935b5fb351a35149a3c9533d29.png
.31              ./.thumbnails/normal/19cc6ac017ef02ff49e14536ef860c41.png
.27              ./.thumbnails/normal/1ddc998312b07a22d1a735be22efdc43.png
.36              ./.thumbnails/normal/205dbda3dc1d4b17dc49b25f300389a8.png
.15              ./.thumbnails/normal/21e5d1422a6fded69c7bee8505f36e38.png
...............

robi
 
OP
RME

RME

Advanced Hacker
Hallo,

@gropiuskalle -- Vielen Dank für Deinen Hinweis auf "TinEye" -- interessant! Von der TinEye Webseite habe ich gelesen dass mit deren Algorithmus (geheim!) Bilder gefunden werden welche zumindest in einem Teil *exakt* mit der Vorlage übereinstimmen. Es werden also keine Bilder gefunden welche *nirgens* exakt übereinstimmen (und daher nur irgendwie ähnlich sind).

Der Algorithmus (ebenfalls geheim) welcher von http://www.gazopa.com (siehe oben) verwendet wird kann hingegen Bilder finden welche nirgens exakt übereinstimmen sondern nur ähnlich sind.

Je nachdem was man will sind die zwei Verfahren daher mehr oder weniger nützlich.

In der Zwischenzeit habe ich gesehen dass es ein Algorithmus, welcher zum vergleichen von Images verwendet werden könnte/kann, für Linux gibt (YaST):

"autopano-sift-C" - SIFT Feature Detection implementation.

Ich werde mir dies mal genauer anschauen.

Oder auch hier: http://user.cs.tu-berlin.de/~nowozin/libsift/ "Ein Algorithmus zum vergleichen von Images."

----------

@robi -- Sehr interessant! Vielen Dank. Ich werde mich mit Deine Angaben auseinandersetzten.

Das ganze Thema (Bilder erkennen) hat ja sehr weitreichende auswirkungen. Ich habe gelesen, dass es sogar eine neue Programmiersprache (oder besser Scripting) gibt wo mit Images programmiert wird. Davon verstehe ich allerdings noch gar nichts. ;)

Nochmals herzlichen Dank für das Interesse.

Gruss,
Roland
 
OP
RME

RME

Advanced Hacker
Hallo,

Für off-line Anwendungen gibts (gerade gefunden, noch nicht näher angeschaut) "imgSeek" -- sieht interessant aus -- und ist OpenSource.

http://www.imgseek.net/

Gruss,
Roland
 
Oben