Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Bilder Checksumme zum vergleichen (https://www.delphipraxis.net/199713-bilder-checksumme-zum-vergleichen.html)

oakley 14. Feb 2019 13:59

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

Neutral General 14. Feb 2019 14:09

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.

Delphi.Narium 14. Feb 2019 14:26

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:
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;
Statt mit Strings kannst Du das Bitmap auch als Stream speichern und dann über diesen die MD5-Checksumme bilden lassen.
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;

newIndy 14. Feb 2019 14:58

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

oakley 15. Feb 2019 09:36

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

Delphi.Narium 15. Feb 2019 10:18

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 Bei Google suchenDelphi ImageEn Compare Picture

Dabei kam dann u. a. dashier raus: TImageEnProc.CompareWith

Eventuell wirst Du da ja noch weiter fündig.

newIndy 15. Feb 2019 18:05

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 17:48 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz