Bilder vergleichen
-
<edit>Abgetrennt aus http://www.c-plusplus.net/forum/viewtopic-var-t-is-118203.html</edit>
gibt es irgendwelche mathematischen Routinen (event. libs, etc.) die einen Bildvergleich durchführen? (Übertragung in den Frequenzbereich - ich erinnere mich gaaaaaanz dunkel?)
Was soll denn bei unterschiedlichen Bildern verglichen werden? Farben, Kanten (Umrisse)?
-
Hallo helfer45
höre schon, du kennst Dich mit Mathematik aus
helfer 45 schrieb:
Was soll denn bei unterschiedlichen Bildern verglichen werden? Farben, Kanten (Umrisse)?
Es sollen einfach nur zwei Screenshots verglichen werden (also 2 Bitmaps). Sobald sich eine Änderung ergibt, z.B. in einem Fenster erscheint etwas (Tastendruck, Meldung, ...) soll die Änderung detektiert werden.
Es genügt die Info, dass sich was ändert. Wo(!) ist egal. Reicht Dir das als Info?Gruß
Freddy
-
Man könnte sich ein Histogramm für die Farben erstellen und Änderungen dort verfolgen. Mann kann auch "Farbwolken" (Farbe +- einen Bereich) verfolgen. Dazu fässt man benachbarte Punkte zusammen die in einem Bereich liegen. Über den Flächenschwerpunkt kann man dann Bewegungen Nachverfolgen (zumindest wenn es eine besondere Farbe ist). Vergleich über Frequenzen ist schwierig, da unterschiedliche Bilder die gleichen Frequenzen haben können. Oder mit Wavelets, da lassen sich den Frequenzen Orte zuordnen, an denen sie auftauchen (schwierig, habe es mal mit einer Datenreihe versucht). Schnelle Algorithmen finden sich in der GNU scientific library.
-
hört sich interessant aber auch sehr komplex an.
was ich noch nicht durchschaut habe, wenn ich mehrere Punkte zusammenfasse, (also addiere etc.) dann muss ich doch trotzdem jedes Pixel berechnen. Oder geht so eine Addition einfach schneller als ein Vergleich (mit dem gleichen Pixel vorher)??
Hast Du Infos zur "GNU scientific library" oder soll ich mal "Dr. Google" fragen?Gruß
Freddy
-
Was mir eben noch eingefallen ist.
Könnte man nicht die beiden Screenshots irgendwie überlagern (vielleicht mittels BitBlt). Dann ist das Ergebnis, wenn die beiden gleich sind schwarz (oder weiß). Dann macht man von diesem Bild eine Fast-Fourier Transformation und müsste dann doch im Frequenzbereich eine Frequenz herauskommen, oder?Bei einer Bildänderung müssten mehrere Frequenzen herauskommen. Richtig? So könnte man eine Auswertung machen ob (nicht was aber das brauche ich nicht) sich etwas ändert.
Soviel zur Theorie. Aber wie programmier ich sowas. Uiuiui.
-
Hast Du Infos zur "GNU scientific library" oder soll ich mal "Dr. Google" fragen?
Ja, dort gibt es auch ein postscript mit Beispielen.
Die Bilder werden durch die Fouriertransformation vom Orts- in den Frequenzbereich verschoben. Wenn du zwei Bilder addierst oder subtrahierst, wirst du nie (außer es handelt sich um dasselbe Bild) nur eine Frequenz als Ergebnis(nach der Fouriertransformation) bekommen. In der Signalverarbeitung werden Signale oft über Korrelationsmethoden (Faltung eines Signals mit einem Anderen) verglichen. Ich weiß aber nicht ob es so etwas für den Vergleich von Bildern gibt.
Ganz dunkel ist mir noch etwas über Mustererkennung in der Optik in Erinnerung geblieben. Ich weiß leider nur noch, daß man die Fouriertransformierten der Bilder (überlagert?) mit einbezogen hat. Vielleicht hat jemand ein besseres Erinnerungsvermögen als ich.
-
Dieser Thread wurde von Moderator/in Jansen aus dem Forum VCL/CLX (Borland C++ Builder) in das Forum Rund um die Programmierung verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
helfer 46 schrieb:
Hast Du Infos zur "GNU scientific library" oder soll ich mal "Dr. Google" fragen?
Verwende bitte in Zukunft für Zitate den Quote-Tag...
-
Freddy74 schrieb:
Es genügt die Info, dass sich was ändert. Wo(!) ist egal.
mach nen crc32 von den bildern und sobald sich der crc32 ändert, hat sich auf dem bild was verändert.
wenn es dir wirklich egal ist wo die änderung passiert ist, wäre das ne sehr einfach und platzsparende methode.rapso->greets();
-
rapso schrieb:
mach nen crc32 von den bildern und sobald sich der crc32 ändert, hat sich auf dem bild was verändert.
wenn es dir wirklich egal ist wo die änderung passiert ist, wäre das ne sehr einfach und platzsparende methode.Die Frage ist hier, ob in diesem Fall "keine Veränderung" mit "bitweise gleich" gleichzusetzen ist. Ich vermute eher, dass das nicht gemeint ist. Es sollen wahrscheinlich eher "größere Veränderungen" detektiert werden. Ich glaube nicht, dass Rauschen zu dem Ergebnis "unterschiedlich" führen soll. Aber vielleicht kann der Threadersteller ja etwas Klarheit in die Angelegenheit bringen.
-
Gregor@Home schrieb:
rapso schrieb:
mach nen crc32 von den bildern und sobald sich der crc32 ändert, hat sich auf dem bild was verändert.
wenn es dir wirklich egal ist wo die änderung passiert ist, wäre das ne sehr einfach und platzsparende methode.Die Frage ist hier, ob in diesem Fall "keine Veränderung" mit "bitweise gleich" gleichzusetzen ist. Ich vermute eher, dass das nicht gemeint ist. Es sollen wahrscheinlich eher "größere Veränderungen" detektiert werden. Ich glaube nicht, dass Rauschen zu dem Ergebnis "unterschiedlich" führen soll. Aber vielleicht kann der Threadersteller ja etwas Klarheit in die Angelegenheit bringen.
er schrieb "Screenshots", die sollten bei nicht kaputter graka eigentlich kein rauschen enthalten.
rapso->greets();
-
rapso schrieb:
er schrieb "Screenshots", die sollten bei nicht kaputter graka eigentlich kein rauschen enthalten.
Ja, sehe es auch gerade. Dann ist deine Lösung natürlich die Beste.
-
Was bitte ist crc32, höre ich zum ersten Mal?
-
helfer 44 schrieb:
Was bitte ist crc32, höre ich zum ersten Mal?
rapso schlägt vor, jeweils einen Hashwert zu berechnen und den dann zu vergleichen. Das sichert zwar im theoretischen fall nicht unbedingt die Gleichheit der Bilder, praktisch gesehen kann es aber als starkes Indiz hierfür gewertet werden. Wenn die Bilder gleich sind, dann wird auch der gleiche Hashwert herauskommen. Wenn die Bilder nicht gleich sind, kommt bei einer guten Hash-Methode nur durch absoluten Zufall auch mal der gleiche Hashwert heraus. Wenn der Hashwert entsprechend groß ist, wird die Wahrscheinlichkeit hierfür sehr gering.
-
Vielen Dank für die Erklärung.
An den Moderator: Ich bin nicht der Autor dieses Beitrags. Das ist Freddy74!!!
-
Guten abend zusammen,
sorry ich war den ganzen Tag unterwegs und deswegen kann ich mich erst jetzt melden.
Das mit dem CRC Code ist eine Super Idee. Danke!!!Ich muss es mal testen wie schnell diese Erstellung ist (Habe irgendwo ein fertiges Stück Code zur CRC32 Erstellung auf der Platte rumfahren).
Ein Rauschen sollte es nicht geben.
Ich halte euch auf dem Laufenden, sobald ich weiter gestestet habe...
Gruß
Freddy