Ich habe ein Bild master.png
und mehr als 10.000 anderer Bilder (slave_1.png
, slave_2.png
, ...). Sie alle haben:Was ist die beste Technik, um die Ähnlichkeit von Bildern zu vergleichen?
- die gleichen Abmessungen
- Das gleiche Format (PNG)
- Das gleiche Bild Hintergrund
98% der Slaves identisch mit dem (zB 100x50 Bildpunkten.) Meister, aber 2% der Sklaven haben einen etwas anderen Inhalt:
- Neue Farben erscheinen
- Neue kleine Formen erscheinen in der Mitte des Bildes
Ich muss diese verschiedenen Sklaven erkennen. Ich benutze Ruby, aber ich habe kein Problem mit einer anderen Technologie.
Ich versuchte, File.binread
beide Bilder und dann vergleichen mit ==
. Es funktionierte für 80% der Sklaven. Bei anderen Slaves wurden Änderungen festgestellt, aber die Bilder waren visuell identisch. Es funktioniert also nicht.
Alternativen sind:
- Zähle die Anzahl der Farben in jeder Slave-Master vorhanden ist und mit vergleichen. Es wird in 100% der Zeit funktionieren. Aber ich weiß nicht, wie man es in Ruby "leicht" macht.
- Verwenden Sie einen Bildprozessor, um nach Histogrammen wie
RMagick
oderruby-vips8
zu vergleichen. Dieser Weg sollte auch funktionieren, aber ich muss weniger CPU/Speicher verbrauchen. - Schreiben Sie ein C++/Go/Crystal-Programm, um Pixel für Pixel zu lesen und eine Anzahl von Farben zurückzugeben. Ich denke, auf diese Weise können wir Leistung erzielen, wenn. Aber sicher ist der harte Weg.
Irgendwelche Erleuchtung? Vorschläge?
Blick in [diese Frage] (http://stackoverflow.com/questions/4196453/simple-and-fast-method-to-compare-images-for -Ähnlichkeit). Viele Optionen wurden dort diskutiert. – Uzbekjon
Eine weitere Anmerkung zum Vergleich mit 'File.binread'. Da Sie einfach Dateiinhalte und Ressourcen und die Leistung einer Wichtigkeit vergleichen, wäre es besser, einfach bash dafür zu verwenden.Schau dir an: 'diff',' cmp' oder 'md5'. – Uzbekjon
Könnte ein Job für [Tensor Flow] sein (https://www.tensorflow.org), wenn Sie einen Klassifikator benötigen. – tadman