AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Bilder Checksumme zum vergleichen

Bilder Checksumme zum vergleichen

Ein Thema von oakley · begonnen am 14. Feb 2019 · letzter Beitrag vom 15. Feb 2019
Antwort Antwort
oakley

Registriert seit: 15. Aug 2005
287 Beiträge
 
#1

Bilder Checksumme zum vergleichen

  Alt 14. Feb 2019, 14:59
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
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

AW: Bilder Checksumme zum vergleichen

  Alt 14. Feb 2019, 15:09
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.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.400 Beiträge
 
Delphi 7 Professional
 
#3

AW: Bilder Checksumme zum vergleichen

  Alt 14. Feb 2019, 15:26
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;
  Mit Zitat antworten Zitat
Benutzerbild von newIndy
newIndy

Registriert seit: 18. Dez 2018
29 Beiträge
 
Delphi XE3 Professional
 
#4

AW: Bilder Checksumme zum vergleichen

  Alt 14. Feb 2019, 15:58
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.

  Mit Zitat antworten Zitat
oakley

Registriert seit: 15. Aug 2005
287 Beiträge
 
#5

AW: Bilder Checksumme zum vergleichen

  Alt 15. Feb 2019, 10:36
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
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.400 Beiträge
 
Delphi 7 Professional
 
#6

AW: Bilder Checksumme zum vergleichen

  Alt 15. Feb 2019, 11:18
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.

Geändert von Delphi.Narium (15. Feb 2019 um 19:42 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von newIndy
newIndy

Registriert seit: 18. Dez 2018
29 Beiträge
 
Delphi XE3 Professional
 
#7

AW: Bilder Checksumme zum vergleichen

  Alt 15. Feb 2019, 19:05
Lohnt es sich denn das Bild in schwarzweiß zu konvertieren für den Vergleich?

Hallo Mirko,

Nein, lass die Bilder einfach in TIEPixelFormat = ie24RGB.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:55 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