![]() |
Bilder Checksumme zum vergleichen
Hallo zusammen,
das Thema Bildvergleich wurde hier schon öfter behandelt jedoch würde ich gerne signifikante Daten der Bilder in eine Datenbank schreiben lassen, um nachher einen schnellen Verlgeich machen zu können ohne jedes Bild aus größeren Galerien einzeln zu analysieren. Im Prinzip geht es mir darum Duplikate zu finden. Vieleicht in Form einer Checksumme oder ähnlich? Wir kann ich das am besten anstellen? Welche Daten bekomme ich aus dem Bild (ich könnte ImageEn verwenden wenn benötigt) die nachher vergleichbar sind. Am Ende wäre eine art prozentuale Übereinstimmung super, muss aber nicht. LG Mirko |
AW: Bilder Checksumme zum vergleichen
Also mit einer Checksumme oder einem Hash bekommst du natürlich keine prozentuale Übereinstimmung.
Bin in dem Bereich alles andere als ein Profi aber aus dem Kopf wüsste ich nicht was du dir abspeichern könntest (abgesehen vom gesamten Bild) um allein mit dem abgespeicherten Daten einen prozentuale Übereinstimmung zu einem anderen/neuen Bild zu berechnen. Generell stellt sich halt bei sowas immer die Frage: Wann sind zwei Bilder ähnlich? Das müsstest du für dich erst mal entscheiden. Wenn du dir die Frage beantwortet hast ist das wahrscheinlich schon die halbe Lösung. |
AW: Bilder Checksumme zum vergleichen
ImageEn ist gut.
Habe damit mal 'nen Ansatz gemacht (aber nicht weiterverfolgt): Bilder in Graustufen verwandeln und auf z. B. 20 * 20 Pixel verkleiner, über das Ergebnis eine MD5-Checksumme erstellen und die in der Datenbank speichern. Findet einiges, aber lange nicht alles. Grob sowas:
Delphi-Quellcode:
Statt mit Strings kannst Du das Bitmap auch als Stream speichern und dann über diesen die MD5-Checksumme bilden lassen.
function GetGrayScaleString(b: Graphics.TBitmap) : String;
var sl : pRGBArray; {Scanline} s : String; i : Integer; j : Integer; Colr : Integer; begin Result := ''; if b.PixelFormat <> pf24bit then begin Result := '<kein gültiges Bild>'; Exit; end; s := ''; for j := 0 to b.Height - 1 do begin sl := b.ScanLine[j]; for i := 0 to b.Width - 1 do begin Colr := HiByte(sl[i].rgbtRed * 77 + sl[i].rgbtGreen * 151 + sl[i].rgbtBlue * 28); s := s + IntToHex(Colr,2); end; end; Result := s; end; function GetImageString(b: Graphics.TBitmap) : String; var bmp : Graphics.TBitmap; Rect : TRect; begin bmp := Graphics.TBitmap.Create; bmp.PixelFormat := pf24bit; bmp.Width := 20; bmp.Height := 20; Rect.Left := 0; Rect.Top := 0; Rect.Right := 20; Rect.Bottom := 20; bmp.Canvas.StretchDraw(Rect,b); Result := GetGrayScaleString(bmp); bmp.Free; end; function GetImageStringMD5(s : String) : String; var Digest : array[0..15] of byte; i : Integer; begin md5.Init; md5.UpdateStr(s); md5.Final(Digest); Result := ''; for i := 0 to 15 do Result := Result + IntToHex(Digest[i],2); end;
Delphi-Quellcode:
function GetImageStringMD5(b : Graphics.TBitmap) : String;
var Digest : array[0..15] of byte; i : Integer; st : TMemoryStream; begin st := TMemoryStream.Create; b.SaveToStream(st); st.Position := 0; md5.Init; md5.UpdateStream(st,st.Size); md5.Final(Digest); Result := ''; for i := 0 to 15 do Result := Result + IntToHex(Digest[i],2); end; |
AW: Bilder Checksumme zum vergleichen
Da kenne ich verschiedene Möglichkeiten,
ImageEn ist eine gute Grundlage, macht aber nicht alles. Um die prozentuale Ausgabe musst du dich meist mit einer passenden Formel selbst kümmern. RGB-Vergleich: Mit CalcAverageRGB die RGB-Werte beider Bilder ermitteln, dann vergleichen. CompareWith, Compares current image with SecondImage and returns a floating point value from 0 to 1 which specifies the percentage of equality. CompareHistogramWith, Compares histograms of current image with SecondImage and returns a floating point value from 0 to 1 which specifies the percentage of equality. IEPatternSearch, Pattern matching MatchHSVRange, Returns the number of matching pixels. ComputeImageEquality, ComputeImageEquality calculates some values to find the similitude of current image with the SecondImage. The method returns True if the images are equal. :-D |
AW: Bilder Checksumme zum vergleichen
Hallo,
danke für die Hilfe. Wenn ich die ImageEN Funktionen verwende kann ich auch das Ergebnis in mehrere Tabellen-Spalten schreiben und diese dann nachher abfragen. Ich denke ich werde es mal so versuchen, so wird das Ergebnis schärfer. Lohnt es sich denn das Bild in schwarzweiß zu konvertieren für den Vergleich? LG Mirko |
AW: Bilder Checksumme zum vergleichen
Habe damit ein paar Dubletten mehr gefunden, aber das mag bei meinen Bildern auch Zufall gewesen sein.
Eine fundierte Begründung für dieses Vorgehen kann ich nicht liefern. War halt nur mal so ein "Probieren wir's doch einfach mal." ;-) Edit: Frag' mal Tante Google ![]() Dabei kam dann u. a. dashier raus: ![]() Eventuell wirst Du da ja noch weiter fündig. |
AW: Bilder Checksumme zum vergleichen
Lohnt es sich denn das Bild in schwarzweiß zu konvertieren für den Vergleich?
Hallo Mirko, Nein, lass die Bilder einfach in TIEPixelFormat = ie24RGB. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:13 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz