Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Doppelte (bzw. ähnliche) Bilder finden
blutiger_anfänger
myCSharp.de - Member



Dabei seit:
Beiträge: 293
Herkunft: Meerbusch, NRW

Themenstarter:

Doppelte (bzw. ähnliche) Bilder finden

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
kleines_eichhoernchen
myCSharp.de - Member

Avatar #avatar-2079.jpg


Dabei seit:
Beiträge: 3.971
Herkunft: Ursprünglich Vogtland, jetzt Much

beantworten | zitieren | melden

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...
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
blutiger_anfänger
myCSharp.de - Member



Dabei seit:
Beiträge: 293
Herkunft: Meerbusch, NRW

Themenstarter:

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
tscherno
myCSharp.de - Member

Avatar #avatar-2584.gif


Dabei seit:
Beiträge: 630
Herkunft: Nürnberger Land

beantworten | zitieren | melden

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
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von tscherno am .
To understand recursion you must first understand recursion
-
http://www.ilja-neumann.com
C# Gruppe bei last.fm
private Nachricht | Beiträge des Benutzers
kleines_eichhoernchen
myCSharp.de - Member

Avatar #avatar-2079.jpg


Dabei seit:
Beiträge: 3.971
Herkunft: Ursprünglich Vogtland, jetzt Much

beantworten | zitieren | melden

Was dort wiederum funktioniert sind beispielsweise Algorithmen zur Ähnlichkeitssuche. Beispiel LCS oder Levenshtein. Diese erfordern aber bei vielen Daten (Pixeln) sehr viel Rechenleistung.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von kleines_eichhoernchen am .
Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...
private Nachricht | Beiträge des Benutzers
Gelöschter Benutzer

beantworten | zitieren | melden

sind die metadaten gleich?
0815Coder
myCSharp.de - Member



Dabei seit:
Beiträge: 767

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
michlG
myCSharp.de - Experte

Avatar #avatar-2909.png


Dabei seit:
Beiträge: 3.430
Herkunft: Naturns - Südtirol - Italien

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
blutiger_anfänger
myCSharp.de - Member



Dabei seit:
Beiträge: 293
Herkunft: Meerbusch, NRW

Themenstarter:

beantworten | zitieren | melden

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...
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von blutiger_anfänger am .
Wenn ich nicht hier bin, findest du mich auf code-bude.net.
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
blutiger_anfänger
myCSharp.de - Member



Dabei seit:
Beiträge: 293
Herkunft: Meerbusch, NRW

Themenstarter:

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

Hallo blutiger_anfänger,

ich würde mich auf die ID nicht verlassen.

herbivore
private Nachricht | Beiträge des Benutzers