Laden...

Doppelte (bzw. ähnliche) Bilder finden

Erstellt von blutiger_anfänger vor 15 Jahren Letzter Beitrag vor 15 Jahren 6.590 Views
B
blutiger_anfänger Themenstarter:in
293 Beiträge seit 2008
vor 15 Jahren
Doppelte (bzw. ähnliche) Bilder finden

Ich stehe momentan vor einem kleinem Problem. Ich habe nen Haufen Grafiken und Bilder... Viele doppelt, jedoch mit verschiedenen Dateinamen.

Wie stelle ich es am besten an, das alle doppelten gefunden werden? Also Bilder mit gleicher Größe und gleichem Titel unabhängig vom Dateinamen...

Gibt es da fertige Klassen für?
Mir fehlt grad einfach der Ansatz...

Liebe Grüße,
Raffi

Wenn ich nicht hier bin, findest du mich auf code-bude.net.

3.971 Beiträge seit 2006
vor 15 Jahren

Wenn der Inhalt des Bildes gleich ist, einfach einen Hash erzeugen (System.Security.Cryptographie.HashCodeProvider), diesen in einem Dictionary speichern

Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...

49.485 Beiträge seit 2005
vor 15 Jahren

Hallo blutiger_anfänger,

was meinst du mit gleichem Titel? Relevant wäre ja wohl der gleiche Bildinhalt.

Tools zum Finden doppelter Dateien gibt es aber wie Sand am Meer. Diese vergleichen aber normalerweise nur den Dateiinhalt. Eine JPG-Datei würde dann nicht als gleich mit einer BMP-Datei betrachtet, selbst wenn der Bildinhalt gleich ist.

Wenn du den gleichen Bildinhalt prüfen willst, dann lade jede Datei mit der Bitmap-Klasse als 24- oder 32bpp-Bild und berechne aus allen Pixeln eine MD5 Summe. Die MD5-Summe kannst du dir als Key eines Dictionaries merken. Ist der Key schon vorhanden, hast du ein doppeltes Bild gefunden.

herbivore

B
blutiger_anfänger Themenstarter:in
293 Beiträge seit 2008
vor 15 Jahren

das klingt doch mal super! ich danke euch für den schneller support!

Wenn ich nicht hier bin, findest du mich auf code-bude.net.

630 Beiträge seit 2007
vor 15 Jahren

Noch als Anmerkung:

das von herbivore vorgeschlagene Verfahren wird nur funktionieren wenn es sich um Kopien des komprimierten Bildes handelt.

Wenn das Originalbild mehrmals mit verschiedenem Dateinamen komprimiert wurde, wird es nicht funktionieren, weil JPEG anscheinend nicht deterministische Algorithmen verwendet und sich somit die erzeugten Bilder geringfügig unterscheiden, was einen anderen MD5-Hash zur folge hat.

Gruss
tscherno

To understand recursion you must first understand recursion

http://www.ilja-neumann.com
C# Gruppe bei last.fm

3.971 Beiträge seit 2006
vor 15 Jahren

Was dort wiederum funktioniert sind beispielsweise Algorithmen zur Ähnlichkeitssuche. Beispiel LCS oder Levenshtein. Diese erfordern aber bei vielen Daten (Pixeln) sehr viel Rechenleistung.

Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...

Gelöschter Account
vor 15 Jahren

sind die metadaten gleich?

0
767 Beiträge seit 2005
vor 15 Jahren

zumindest jpgs haben Metadaten namens "Eindeutige Id". Wenn sich das Format nicht ändert sondern die Datei nur kopiert / umbenannt wird, kannst du sicher dieses verwenden. (Picasa macht das auch, hab meine dupletten damit wegbekommen)

loop:
btst #6,$bfe001
bne.s loop
rts

3.430 Beiträge seit 2007
vor 15 Jahren

Hallo zusammen,

vor kurzem hat sich meine Festplatte zugemüllt, somit habe ich alle doppelten Fotos gelöscht.

Dafür habe ich Dupehunter Professional
verwendet. Das ist zwar nur eine Shareware 30-Tage, aber meistens reicht es ja, wenn man doppelte Dateien einmal löscht 😉

Beim Dupehunter ist es egal wie die Dateien heissen und wo sie sich befinden.
Ich bin aber nicht sicher ob er auch bei verschiedenen Dateitypen feststellt dass es die selben Fotos sind.

Gruss
Michael

B
blutiger_anfänger Themenstarter:in
293 Beiträge seit 2008
vor 15 Jahren

Danke für die Hinweise - da muss ich mir noch was schlaues einfallen lassen, weil dass das mit den jpegs so nicht ganz hinhaut musst ich grade auch feststellen... Die Shareware kommt eigentlich auch nicht in Frage...

Ich möchte eine große öffentliche Gallery in Form eines Homepage Projektes ansetzen. Den Usern sit es auch erlaubt weitere Bilder hinzuzufügen, welche jedoch erst von mir kontrolliert werden, ob sie gegen die Regeln verstoßen und ob das Bild vorhanden ist.

Ob ein Bild gegen die Regeln verstößt muss ich leider von Hand kontrollieren. Das wird mir kein Programm sagen können, ob das Bild pornographische Inhalte enthält, aber die Dupletten, welche bei einer großen Bilderanzahl schnell vorkommen, werde ich von Anhieb und auch kein User mal ebenso aus dem Gedächnis erkennen können.

Von daher bin ich halt grade auf der Suche nach einer Möglichkeit zu überprüfen, ob die neuen Bilder, schon in der Gallery vorhanden sind...

Die Algorithmen fallen denke ich mal bei der großen Bilderanzahl weg, vorallem, da die Software direkt per Remotedesktop auf dem Server laufen soll und ich diesem keine zusätzliche große Last zumuten möchte...

Somit bleibt mir nur die Spur mit den Metadaten, wenn ich das richtig verstanden hab...

Hat da eventuell jemand eine nützliches Tutorial bezüglich c# am Start?

liebe Grüße,
Raffi

edit://

ja ich bin des Googlen's mächtig 🙂 Nicht das mir hier gleich wer was alá google-ist-dein-freund postet 😉
Trotzdem hab ich immernoch Interesse an guten Tutorials oder vielleicht sogar nem Snippet...

Wenn ich nicht hier bin, findest du mich auf code-bude.net.

49.485 Beiträge seit 2005
vor 15 Jahren

Hallo blutiger_anfänger,

bei einer Ähnlichkeitssuche musst du aus dem Bild einen Vektor extrahieren, der das Bild bzw. deine Eigenschaften/Merkmale beschreibt. Anschließend reicht es die Vektoren zu vergleichen, um Ähnlichkeiten zu finden. Um einen Vergleich des Vektors des neuen Bildes gegen alle Vektoren der bestehenden Bilder wirst du aber kaum drum rum kommen, siehe Aus großer Menge von vieldimensionalen Vektoren die ähnlichsten finden.

Wie so ein Vektor aufgebaut ist, hängt davon ab, was man als ähnlich betrachtet. So ein Vektor ist einfach eine Liste von Ähnlichkeitsmerkmalen. Dazu kann die Durchschnittsfarbe, die Standardabweichung, der Dynamikumfang, das Frequenzspektrum des Bildes usw. dienen.

Um Bilder zu finden, die sich nur durch Kompressions- oder Skalierungsartefakte oder kleine Änderungen - wie entferne rote Augen - unterscheiden, habe ich gute Erfahrungen damit gemacht als "Vektor" die Pixel eines 24bpp 24x24 Thumbnail zu verwenden. Dieses Thumbnail wird mit dem Code [gelöst] Bitmap-Randproblem beim Verkleinern mit InterpolationMode.HighQualityBilinear erstellt (Achtung: im Beispielcode wird 25x25 verwendet, das führt aber zu unnötigen Füllbytes, besser ist 24x24 oder andere durch 4 teilbare Längen) und der Vektor anschließend mit LockBits Byteweise ausgelesen.

bmpdThumb = bmpThumb.LockBits (rectThumb,
                               ImageLockMode.ReadOnly,
                               bmpThumb.PixelFormat);
abThumb = new byte [3 * bmpThumb.Width * bmpThumb.Height];
Marshal.Copy (bmpdThumb.Scan0, abThumb, 0, abThumb.Length);
bmpThumb.UnlockBits (bmpdThumb);

Als Maß für die Ähnlichkeit zweier Vektoren dient die Summe des quadratischen Abstands der Pixeldifferenz.

for (int j = abCurr.Length - 1; j >= 0; --j) {
    iPixelDelta = abCurr [j] - abThumb [j];
    iDelta += iPixelDelta * iPixelDelta;
}

Natürlich kann (und sollte) man die Schleife abbrechen, wenn die Differenz schon so groß geworden ist, dass man die Bilder als sicher unterschiedlich einstuft.

Die Kunst liegt in der Wahl der Schwelle. Sie muss groß genug sein, um sich an den Artefakten nicht zu stören und anderseits nicht zu groß, damit nicht ähnlichfarbige Bilder mit komplett unterschiedlichen Motiven als gleich erkannt werden.

Quadratische Abweichungen von durchschnittlich bis zu 100-1000 pro Pixel sind ein guter Ausgangspunkt für eigene Experimente.

Das Verfahren ist allerdings weder besonders speicherplatz- noch rechenzeitsparend. Aber es liefert brauchbare Ergebnisse.

herbivore

B
blutiger_anfänger Themenstarter:in
293 Beiträge seit 2008
vor 15 Jahren

Ich danke dir für die super ausführliche Antwort 🙂 Ich würd gern mal von dir als c# Guru, deine Meinung zu der Idee die Id im Metatag zu vergleichen, hören... Da sich meien Gallerie fast ausschließlich aus .jpegs zusammensetzt.

Wenn ich nicht hier bin, findest du mich auf code-bude.net.

49.485 Beiträge seit 2005
vor 15 Jahren

Hallo blutiger_anfänger,

ich würde mich auf die ID nicht verlassen.

herbivore