AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Bilder schnell miteinander vergleichen
Thema durchsuchen
Ansicht
Themen-Optionen

Bilder schnell miteinander vergleichen

Offene Frage von "FriFra"
Ein Thema von Flips · begonnen am 12. Nov 2006 · letzter Beitrag vom 17. Aug 2009
Antwort Antwort
Seite 2 von 5     12 34     Letzte »    
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#11

Re: Bilder schnell miteinander vergleichen

  Alt 13. Nov 2006, 19:32
Wenn Du wissen willst, ob zwei Bilder identisch sind, oder nicht, dann reicht dieser Code:
Delphi-Quellcode:
Function CompareBitmap (Bitmap1, Bitmap2 : TBitmap) : Integer;
  If CompareMem (Bitmap1.Scanline[Bitmap1.Height - 1], Bitmap2.ScanLine [Bitmap2.Height - 1], Bitmap1.Width*Bitmap1.Height*SizeOf(TRGBTriple)) Then
    Result := 0
  Else
    Result := 1
End;
Dieses Fragment liefert 1, wenn die Bitmaps ungleich sind und 0, wenn sie identisch sind. Das ist nochmal 10% schneller als Dein Code. Die Voraussetzungen sind die Gleichen: Gleiche Auflösung, gleiche Größe, gleiches Pixelformat.

Mit FastCode (siehe FastCode.Sourceforge.net) kannst Du dann nochmal 20% rausholen...
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Phantom1

Registriert seit: 20. Jun 2003
282 Beiträge
 
Delphi 10.4 Sydney
 
#12

Re: Bilder schnell miteinander vergleichen

  Alt 13. Nov 2006, 19:36
Ich hab das jetzt nochmal nachgeprüft und muss alzaimar recht geben, dein Algo ist schneller wenn die Bilder nur wenige oder garkeine unterschiede haben, das ganze dreht sich aber um wenn es sehr viele unterschiede gibt oder wenn komplett verschiedene bilder miteinander verglichen werden.

Gleiche Bilder vergleichen (500 durchläufe):
dein Algo: 1 sek
mein Algo: 1,7 sek

zwei komplett unterschiedliche Bilder vergleichen (500 Durchläufe):
dein Algo: 3,7 sek
mein Algo: 1,7 sek

Damit sollte die sache geklärt sein

@Alzaimar: was ist wenn er wirklich wissen muss wieviele unterschiede in 2 Bildern vorhanden sind? Was er genau damit machen will wissen wir ja nicht genau.

mfg
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#13

Re: Bilder schnell miteinander vergleichen

  Alt 13. Nov 2006, 19:56
Hier ist mein (ungetesteter) Vorschlag.
Es hat folgende Vorteile:
* man kann eine Maske angeben, um Farbunterschiede unterhalb einer bestimmten Grenze auszublenden
* durch Verwendung von Zeigern wird der Vergleich schneller
* die innere Schleife ist schneller, da sie auf 0 runterzählt
* der Code ist "kurz & knackig"
Delphi-Quellcode:
function CompareImagesShmia(Image1,Image2:TBitmap; mask:Cardinal=$00FEFEFE):Int64;
var x,y:integer;
    P1,P2: PByte;
begin
result := 0;
for y := 0 to Image1.Height -1 do
  begin
    P1 := Image1.ScanLine[y];
    P2 := Image2.ScanLine[y];

    for x := Image1.Width-1 downto 0 do
    begin
      if (PInteger(P1)^ and mask) <> (PInteger(P2)^ and mask) then
        inc(result);
      Inc(P1, 3); Inc(P2, 3);
    end;
  end;
end;
Nachtrag:
die Variable mask muss evtl. mit $FEFEFE00 vorbelegt werden.
Für den Vergleich werden ja 4 Bytes=Integer gelesen; es kommt nun drauf an,
ob das überzählige Byte MSB oder LSB ist.
Andreas
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#14

Re: Bilder schnell miteinander vergleichen

  Alt 13. Nov 2006, 20:03
Zitat von Phantom1:
@Alzaimar: was ist wenn er wirklich wissen muss wieviele unterschiede in 2 Bildern vorhanden sind? Was er genau damit machen will wissen wir ja nicht genau.
mfg
Das der Algo die Anzahl der unterschiedlichen Pixel zurückliefert, ist irgendwie klar , aber der Sinn ist nicht ersichtlich. Wozu? Wann sind Bilder in Auflösung, Größe und Farbtiefe absolut vergleichbar? Na ja, Anwendungen gibts bestimmt, hast schon recht
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Phantom1

Registriert seit: 20. Jun 2003
282 Beiträge
 
Delphi 10.4 Sydney
 
#15

Re: Bilder schnell miteinander vergleichen

  Alt 13. Nov 2006, 20:47
@shima: dein Code bringt eine AV, du hast die Pointer P1 und P2 als PByte und inkrementierst diese bei der x-schleife mit 3

mfg
  Mit Zitat antworten Zitat
Benutzerbild von Airblader
Airblader

Registriert seit: 29. Okt 2004
Ort: Geislingen an der Steige
742 Beiträge
 
#16

Re: Bilder schnell miteinander vergleichen

  Alt 14. Nov 2006, 00:12
Ich kenn mich zwar nicht allzugut darin aus, aber wandelt der Borlandcompiler Schleifen nicht immer in ein downto um? (Ergo ist es egal ob ich es als downto hinschreibe oder nicht).

air
Ingo Bürk
Es nimmt der Augenblick, was Jahre geben.

Johann Wolfgang von Goethe
  Mit Zitat antworten Zitat
mbamler

Registriert seit: 19. Mai 2005
Ort: Hamburg
118 Beiträge
 
Delphi 7 Architect
 
#17

Re: Bilder schnell miteinander vergleichen

  Alt 14. Nov 2006, 07:58
Zitat von Airblader:
Ich kenn mich zwar nicht allzugut darin aus, aber wandelt der Borlandcompiler Schleifen nicht immer in ein downto um? (Ergo ist es egal ob ich es als downto hinschreibe oder nicht).

air
Das tut er - zumindest, wenn die Compiler-Optimierungen eingeschaltet sind...

Gruß
Matthias
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#18

Re: Bilder schnell miteinander vergleichen

  Alt 14. Nov 2006, 10:55
Zitat von Phantom1:
@shima: dein Code bringt eine AV, du hast die Pointer P1 und P2 als PByte und inkrementierst diese bei der x-schleife mit 3
Natürlich müssen die Bitmaps im 24Bit-Format vorliegen. (bitmap.PixelFormat := pf24bit)
Ein Pixel benötigt 24Bit = 3 Bytes; daher werden die Zeiger jeweils um 3 Bytes inkrementiert.
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.641 Beiträge
 
#19

Re: Bilder schnell miteinander vergleichen

  Alt 14. Nov 2006, 11:08
Zitat von alzaimar:
Viel interessanter wäre es, einen Ähnlichkeitsindex von zwei beliebigen Bildern zu erstellen, die unterschiedlich kodiert (JPEG vs. BMP) und in unterschiedlichen Farbtiefen und Auflösungen vorliegen.
Was auch nicht so hyperkompliziert ist. Das wichtigste ist erstmal eine mehr oder weniger saubere Kanten- und Flächenerkennung, die Umrechnung dieser erkannten Kanten in Vektoren und dann die Vergleiche der enstprechenden Vektoren zusammen mit einem Farbvergleich der umschlossenen Flächen.

Daraus kann man dann mit einer gewissen Genauigkeit darauf schliessen, ob verschiedene Bilder das gleiche Motiv zeigen oder nicht, oder ob sie das gleiche Motiv mit einer verschobenen Position zeigen.

Alternativ kann man auch einfach einen Bildausschnitt nehmen (z.B. ein kleines Quadrat) und das dann auf dem nächsten Bild solange herumschieben bis es wieder ein Treffer ist. Das setzt aber wieder gleiche Auflösung und Farbtiefe voraus. Mit diesem Verfahren wird übrigens in MPEG-Videocodes ermittelt welche Bereiche im folgenden Bild aus Teilen des Vorherigen bestehen und dann wird komprimiert in dem gesagt wird: Der Ausschnitt (x,y, breite,höhe) aus Bild X kommt an diese Position (x,y) in Bild Y. Spart massigst Daten
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
Phantom1

Registriert seit: 20. Jun 2003
282 Beiträge
 
Delphi 10.4 Sydney
 
#20

Re: Bilder schnell miteinander vergleichen

  Alt 14. Nov 2006, 11:10
Zitat von shmia:
Natürlich müssen die Bitmaps im 24Bit-Format vorliegen. (bitmap.PixelFormat := pf24bit)
Ein Pixel benötigt 24Bit = 3 Bytes; daher werden die Zeiger jeweils um 3 Bytes inkrementiert.
Das ist mir schon klar, aber dein Code bringt eine AV.

so sieht deine x-schleife aus
for x := Image1.Width-1 downto 0 do ich vermute mal du wolltest es so hier machen, dann müsste dein code glaub ich gehen:
for x := Image1.Width div 3-1 downto 0 do mfg
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 5     12 34     Letzte »    


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 22:12 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