Autor | Beitrag |
---|
000 04.12.2009, 23:03 Felheart |
Hi, ich arbeite derzeit an einem Projekt (privat) welches Bilder von Webseiten Das ganze funktioniert dank der Skalierung auch ziemlich gut. Deshalb hier die Frage(n): |
Profil || Suche |
001 05.12.2009, 03:25 Hanfling |
Guck dir mal einen auf 32x32px runtergerechneten Comic an. Ich glaube das da oft was gleich aussieht sollte dich ned wundern. Warum wandelst du es in Graustufen um anstatt einfach jeweils die einzelnen RGB Kanäle zu betrachten? --Nun ist deine Zeit gekommen sprach der Tod, stolperte und brach sich das Genick. :o |
Profil || Suche |
002 05.12.2009, 13:36 dp Administrator |
hier duerften sich einige algos finden, http://scholar.google.com/scholar?hl=en&as_sdt=2000&q=detecting+duplicate+images -- |
Profil || Suche |
003 05.12.2009, 15:10 Felheart |
Ich wandle es in Graustufen um, um die Dateigröße meiner Datenbank zu reduzieren. Außerdem wüsste ich nicht was das betrachten der einzelnen Kanäle für einen Vorteil hätte, ob ich zuerst Graustufen draus mache und dann die Oder habe ich deine Vorgehensweise vielleicht falsch verstanden? @dp: Danke, sieht gut aus, werde ich mich durchwühlen. --Dieser Beitrag wurde am 05.12.2009 um 15:11 von Felheart bearbeitet. |
Profil || Suche |
004 05.12.2009, 16:22 Hanfling |
Du sollst ja eben nicht die 3 Kanäle zusammenrechnen. --Nun ist deine Zeit gekommen sprach der Tod, stolperte und brach sich das Genick. :o |
Profil || Suche |
005 05.12.2009, 16:36 Felheart |
Naja, angenommen ich hab die Differenz von den 3 Kanälen, dann Meine Funktion übernimmt ja 2 Bilder und errechnet den Prozentwert zu dem |
Profil || Suche |
006 05.12.2009, 17:50 Bluthund |
Natürlich musst du für deine Auswertung am Ende alles durch eine Funktion jagen, die dann sämtliche Information auf einen Prozentwert oder gleich einen BOOLschen Wert abbildet, um den Vergleich zu bewerkstelligen. Aber bis dahin solltest du versuchen ein gesundes Maß an Informationen zu erhalten anstatt sie zu vernichten. (Die feste Skalierung auf 32² vernichtet bspw. umso mehr Information je größer das Ursprungsbild war) Zu RGB vs Grayscale am Beispiel: The C language combines all the power of assembly language with all the ease-of-use of assembly language. Dieser Beitrag wurde am 05.12.2009 um 17:55 von Bluthund bearbeitet. |
Profil || Suche |
007 05.12.2009, 17:52 CPoly |
Eben nicht. Ich hab hier mal schnell ein Bild zur Anschauung zusammengeschustert. Du siehst, die Graustufen sind exakt gleich! -- |
Profil || Suche |
008 05.12.2009, 19:49 Felheart |
Ok, dann werde ich die Bilder auf 64² skalieren lassen. Das mit den Farben ist mir ja auch klar, dass eben Grau nicht gut ist (nur einfacher zu rechnen), aber wie schlagt ihr vor das ich dann weiterverfahre? Angenommen ich habe das "DifferenzBild" von Rot, Blau und Grün. Folglich darf ich aus den 3 Channels keinen Durchschnitt bilden. @Bluthund: Ich hab folgende Formel für Color->Gray benutzt: @CPoly: Das ich die Farben irgenwie in meine Berechnung einbeziehen sollte ist mir schon |
Profil || Suche |
009 05.12.2009, 20:33 caedes |
nein, macht es nicht, ist doch offensichtlich: (R+G+B)/3 == 1/3 * (R+G+B) == 1/3 * R + 1/3 * G + 1/3 * B (und 1/3 == 0.3333...) deine formel gewichtet also grün deutlich überdurchschnittliche und blau sehr unterdurchschnittlich aus den 3 differenzbildern einen prozentwert? 3 prozentwerte mitteln zb? oder den maximalen wert nehmen (pro pixel)? --caedes Deutschland rückt nach Einschätzung der Sicherheitsbehörden im Superwahljahr verstärkt ins Visier von Terroristen. Dieser Beitrag wurde am 05.12.2009 um 20:34 von caedes bearbeitet. |
Profil || Suche |
010 05.12.2009, 21:10 Felheart |
Ob ich das Bild in Graustufen mache und dann die mittlere Differenz berechne oder ob ich das Mittel aus 3 verschiedenen Differenzbildern bilde ist das selbe. @caedes: Einen Unterschied macht es schon das ich eine andere Formel für die Dieser Beitrag wurde am 05.12.2009 um 21:42 von Felheart bearbeitet. |
Profil || Suche |
011 05.12.2009, 22:58 CPoly |
Du hast meinen Post falsch gedeutet, ich dachte das Bild würde alles sagen. Auf dem Bild sind links zwei offensichtlich verschiedene Bilder. Wenn du die beiden aber in Graustufe umwandelst, ergibt sich nach deinem Algorithmus eine Ähnlichkeit von 100%. Wenn du hingegen aus den Ähnlichkeiten der drei Kanäle einen Mittelwert bildest, kommt nicht 100% raus! Edit: Da du nicht alle Kanäle gleich stark gewichtest, sind es natürlich keine 100% mehr, aber das spielt ja keine Rollte in meiner Argumentation. --Dieser Beitrag wurde am 05.12.2009 um 23:01 von CPoly bearbeitet. |
Profil || Suche |
012 05.12.2009, 23:45 theDon |
Der gute Mann heisst Boole. -- \o tanz den naziprau! o/ And more than ever, I hope to never fall, |
Profil || Suche |
013 06.12.2009, 02:26 Felheart |
@CPoly: Ahh stimmt, ja habs jetzt verstanden, danke. |
Profil || Suche |
014 06.12.2009, 19:54 LeJean |
Ich denke mal, dass du Bilder jetzt nicht unter Einbezug von z.B. affinen Transformationen (Rotation, Skalierung, Verschiebung) noch als gleich erkennen möchtest, sondern dass du davon ausgehst, dass zwei gleiche Bilder auch wirklich gleich sind. Hier mit höheren Modellen der Mustererkennung heranzugehen wär mit Kanonen auf Spatzen geschossen. Trotz allem musst du Invarianten finden, was dann aber natürlich einfacher ist, weil du schlicht keine Freiheitsgrade für Transformationen berücksichtigen musst. Eine Skalierung auf 32x32 Pixel würde dir also die Möglichkeit geben, Bilder in einem Vektor mit 1024 Elementen (jeweils im Wertebereich von 0..255) darzustellen. Du kannst Vektoren solcher Bilder elementweise vergleichen, bei 1024 Elementen geht das ja noch recht schnell. Du könntest aber auch nen Monte-Carlo Ansatz nehmen und beliebige Punkte aus deiner Bildmatrix greifen (z.B. 30 Stück), sie in ihrer 4er-Nachbarschaft identifizieren und mit dem zu vergleichenden Bild abgleichen. Damit hättest du noch 150 Schritte für einen Vergleich von zwei Matrizen, der dir schon erstaunlich gute Ergebnisse liefern kann. |
Profil || Suche |
015 07.12.2009, 00:05 Felheart |
Klar währe es nett Skalierte oder verschobene Bilder zu erkennnen, aber der dafür benötigte Aufwand ist einfach zu groß, das hast du recht, so übertrieben gut muss das ganze ja auch nicht funktionieren. Jop, so mach ich es ja derzeit schon, oder? 4er-Nachbarschaft? Also drüber, drunter, links und rechts? Was ist mit identifizieren genau gemeint? Testen ob die Unterschiede Nachbarschaften gleich sind oder so ähnlich? Ich gehe mal davon aus dass sich deine 150 Schritte aus den 5 * 30 Pixeln ergeben. Wie würdest du dann ganz spezifisch die Matrizen dann vergleichen? Doch auch nur wieder über mittlere Abweichung, oder was gibt es da noch für bessere Methoden? Also Kurzum würdest du alle 34Pixel ein Pixel und seine Nachbarn mit dem anderen Bild vergleichen oder wie? -- |
Profil || Suche |
016 07.12.2009, 14:50 LeJean |
Ja, die 4er-Nachbarschaft besteht aus 5 Pixeln: Dem Referenzpixel selbst und den 4 direkten Nachbarn: Nord, Ost, Süd, West. Als Beispiel: Du hast den Pixel (10, 15) zufällig herausgegriffen. Als Charakteristik lässt sich der Pixel mit seiner Nachbarschaft vektoriell als (G_r, G_n, G_o, G_s, G_w)^T darstellen. Dabei ist G der Grauwert und r, n, o, s, w sind Indizes, die für referenz, nord, ost, süd, west stehen. Ganz konkret setzt sich der Vektor für unser Beispielpixel (10, 15) so zusammen: Dann nimmst du den Vektor aus deinem einen Vergleichsbild und den passenden Vektor zu Pixel (10, 15) aus deinem Bild der Datenbank und vergleichst die Vektoren komponentenweise. Du kannst sie auch entsprechend einer gewünschten Gewichtung der Komponenten noch normieren, die Funktion dafür kannst du dir im Grunde selbst aussuchen, du kannst sie aber auch erstmal ganz weg lassen. Es gibt noch andere Ansätze (z.B. über C-Transformationen der Bilder) mit denen du auf Gleichheit (nicht wirklich auf Ähnlichkeit) prüfen kannst. Hab grad nicht die Zeit, mehr darüber zu schreiben, aber vllt hol ich das heute abend oder morgen mal nach... (Vorab schonmal das hier bzw. allgemein das hier) --Dieser Beitrag wurde am 07.12.2009 um 15:05 von LeJean bearbeitet. |
Profil || Suche |
017 07.12.2009, 16:52 speziFanta |
Auch auf die Gefahr hin, mich mit meinem Betrag zu disqualifizieren, aber wie sähe es mit folgender Methode aus: Man nimmt beide Graubilder, invertiert eines davon und addiert diese miteinander. Wenn die Summe "weiß" ist folgt daraus, dass die Bilder gleich sind. Edit: oder ist das genau das, was du mit der "Helligkeitsdifferenz" meintest? --Heute schon gegoogelt? Dieser Beitrag wurde am 07.12.2009 um 16:59 von speziFanta bearbeitet. |
Profil || Suche |
018 07.12.2009, 17:48 Bluthund |
Hoecker... :P Der einzige Unterschied ist, dass du dich damit bei zunehmender Gleichheit an Weiß annäherst (a + m-(a+R) geht für R->0 gegen m) und er an Schwarz (a-(a+R) geht für R->0 gegen 0). @Felheart: Was mir gestern noch eingefallen ist: Gerade durch die Skalierung auf Briefmarkengröße, könnten wenn es sich um viele ähnliche Motive (bspw. Landschaften) handelt sehr schnell viele False-Positives ergeben. @td: The C language combines all the power of assembly language with all the ease-of-use of assembly language. |
Profil || Suche |
019 07.12.2009, 20:18 Felheart |
@LeJean: Diese C-Transformation aus dem PDF sieht übrigens sehr vielversprechend aus! @speziFanta: @Bluthund: Das ist (wie ich es mache) dann natürlich quatsch, da hast du recht. Ich bin inzwischen (da es mir auch selber aufgefallen ist) dazu übergeganen "G = (R+G+B)/3" anstatt einer gewichteten Formel zu verwenden. Die Quelle der Bilder kann (schwierigerweise) jede Internetadresse sein. Ein Beispiel: Das Programm erhält alle ~1800 URLs zu den einzelnen Seiten des "Postet whatever"-Threads. Es erstellt nun eine Liste von "Bild-URLs"[png;jp_g] und fängt an alles runterzuladen. (Ist nur ein Beispiel, denn, URLs können von überall her kommen, im Extremfall können sogar die ThreadURLs aus den Imageboards von 4chan als Quellen kommen) Hier besteht natürlich eine extreme Gefahr das jemand irgendwas quotet oder auf irgendeine Art und Weise nochmal postet. |
Profil || Suche |
020 26.12.2009, 20:06 Agamemnon-Hellmapper |
Sehr interessantes Thema... Bzgl Kompressionsartefakte: Es gibt 2 Möglichkeiten, eine Kristallkugel zu benutzen: |
Profil || Suche |
021 26.12.2009, 20:36 Hanfling |
Das Problem mit den Kompressionsartefakten sollte sich doch durch das verkleinern von selbst lösen. Falls es nicht schon gesagt wurde, würde ich in jedem Fall die Hashes der Bilder speichern und damit abgleichen ob das Bild schon vorhanden ist. --Nun ist deine Zeit gekommen sprach der Tod, stolperte und brach sich das Genick. :o |
Profil || Suche |
022 26.12.2009, 23:32 LeJean |
Huch, lang nicht mehr reingeschaut... Ganz kurz zu deiner "Normal"-Verteilung (du meinst sicher ne gleichmäßige Verteilung :D ) -- dann könntest du die Bilder auch direkt verkleinern und Pixelweise vergleichen. Bei der von mir vorgeschlagenen Methode geht's ja darum, nicht zu viele Informationen durch Reduktion der Auflösung zu verlieren. Den Vergleich auf Zufallspixeln kannst du dann im Nachhinein immernoch "verstellen" indem du mehr oder weniger Pixel wählst, ohne dass du wieder alle Bilder in höherer Auflösung brauchst. Zu dem vom Hellmapper: Kompressionsartefakte schlagen sich übrigens gerade nicht in hohen Frequenzen nieder, sondern sie sind Resultat von fehlenden hohen Frequenzen. Wenn du ein JPEG mit hohem Grad komprimierst, dann werden die hohen Frequenzen nämlich weggeschnitten und es kommt zu Kanteneffekten entlang der Gradienten im Bild. Naja, solang du keine Rücktransformation machst um das Bild wieder zu speichern, sondern nur die FFT nutzt um dann Frequenzen in einem bestimmten Bereich zu vergleichen, könnte dir das trotzdem Erfolg bringen. -- |
Profil || Suche |
023 29.12.2009, 16:07 Agamemnon-Hellmapper |
Klar, wenn man alle Frequenzen vergleicht, hat man nix gewonnen. Aber da bei jpgs ja die hohen Frequenzen rausgeschnitten werden, braucht man sie wohl auch nicht vergleichen. Bei anderen Formaten mit anderen Kompressionsmethoden hat man hingegen tatsächlich wieder Informationsverlust, aber um den wird man, wenn es schneller gehen soll, nicht drumherum kommen. - oder man denkt sich noch ne andere Methode aus. Zumidest glaube ich, würde mein Vorschlag die Anzahl an Falsepositives bei Comics gegenüber der Einzelpixelmethode reduzieren. --Es gibt 2 Möglichkeiten, eine Kristallkugel zu benutzen: |
Profil || Suche |
024 29.12.2009, 17:12 KhanRKerensky |
Mich wunderts das noch keiner SSIM in den Raum geworfen hat. Damit müsste sich das Problem der Bildähnlichkeit doch eigentlich sehr einfach (gibt ja schon fertige Implementationen) aus dem Weg räumen lassen. Die beiden Bilder müsste man zwar vorher auf eine Größe skalieren, aber das dürfte recht wenig ausmachen. --"[...] you're going to burn in a very special level of Hell. A level they reserve for child molesters and people who talk at the theater." - Book |
Profil || Suche |