AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Code-Bibliothek Neuen Beitrag zur Code-Library hinzufügen Delphi Bildvergleich mit ZeroMeanNormalizedCross-Correlation (ZNCC)
Thema durchsuchen
Ansicht
Themen-Optionen

Bildvergleich mit ZeroMeanNormalizedCross-Correlation (ZNCC)

Ein Thema von christian.noeding · begonnen am 13. Dez 2009 · letzter Beitrag vom 19. Feb 2013
Antwort Antwort
Benutzerbild von christian.noeding
christian.noeding

Registriert seit: 26. Mai 2005
Ort: Knw.-Remsfeld
119 Beiträge
 
Delphi XE2 Professional
 
#1

Bildvergleich mit ZeroMeanNormalizedCross-Correlation (ZNCC)

  Alt 13. Dez 2009, 13:22
Auf der Suche nach einer Möglichkeit, mehrere Bilder miteinander zu vergleichen bin ich auf die Kreuz-Korrelation gestoßen. Mit dem folgenden Algorithmus kann man zwei Canvas beliebiger Größe miteinander vergleichen und bekommt das Ergebnis als Prozentwert der Übereinstimmung zurück. 100% bedeutet demnach perfekte Übereinstimmung.
Alternativ kann der schwächere SSD Algorithmus verwendet werden. Link: SSD

Delphi-Quellcode:
type
  PRGBTripleArray = ^TRGBTripleArray;
  TRGBTripleArray = array [0..31] of TRGBTriple;
Delphi-Quellcode:
function RGB2TColor(const R, G, B: Byte): Integer;
begin
  // convert hexa-decimal values to RGB
  Result := R + G shl 8 + B shl 16;
end;
Delphi-Quellcode:
procedure TColor2RGB(const Color: TColor; var R, G, B: Byte);
begin
  // convert hexa-decimal values to RGB
  R := Color and $FF;
  G := (Color shr 8) and $FF;
  B := (Color shr 16) and $FF;
end;
Delphi-Quellcode:
// ZeroMeanNormalizedCross-Correlation (ZNCC) (wird MAXIMAL bei guter Übereinstimmung)

function TForm1.ZNCC(Bild1, Bild2: TBitmap):Single;
var
  x, y:integer;
  P1,P2:array[0..31] of PRGBTripleArray;

  a, b, zaehler, nenner1, nenner2, nenner, summe1, summe2, mean1, mean2:single;

  ZNCCvalue:Extended;
begin
  // ZeroMeanNormalizedCross-Correlation (ZNCC) (wird MAXIMAL bei guter Übereinstimmung)
  zaehler:=0.0;
  nenner1:=0.0;
  nenner2:=0.0;
  summe1:=0.0;
  summe2:=0.0;

  // Bildformat auf 24bit setzen (also ohne Alpha-Kanal)
  Bild1.PixelFormat := pf24bit;
  Bild2.PixelFormat := pf24bit;

  // Summen bilden
  for y:=0 to Bild1.Height-1 do
  begin
    P1[y]:=Bild1.ScanLine[y];
    P2[y]:=Bild2.ScanLine[y];

    for x:=0 to Bild1.Width-1 do
    begin
      summe1:=summe1+RGB2TColor(P1[y][x].rgbtRed, P1[y][x].rgbtGreen, P1[y][x].rgbtBlue);
      summe2:=summe2+RGB2TColor(P2[y][x].rgbtRed, P2[y][x].rgbtGreen, P2[y][x].rgbtBlue);
    end;
  end;

  mean1:=(1/power((Bild1.Width-1)+(Bild1.Height-1)+1,2))*summe1;
  mean2:=(1/power((Bild1.Width-1)+(Bild1.Height-1)+1,2))*summe2;
  for x:=0 to Bild1.Width-1 do
  begin
    for y:=0 to Bild1.Height-1 do
    begin
      a:=RGB2TColor(P1[y][x].rgbtRed, P1[y][x].rgbtGreen, P1[y][x].rgbtBlue)-mean1;
      b:=RGB2TColor(P2[y][x].rgbtRed, P2[y][x].rgbtGreen, P2[y][x].rgbtBlue)-mean2;
      zaehler:=zaehler+(a*b);
      nenner1:=nenner1+power(a, 2);
      nenner2:=nenner2+power(b, 2);
    end;
  end;
  nenner:=sqrt(nenner1*nenner2);

  if nenner>0 then
    ZNCCvalue:=zaehler/nenner
  else
    ZNCCvalue:=0.0;

  result:=ZNCCvalue*100;
end;
Der Code hat bei mir gut funktioniert. Anbei auch nochmal der Original-Algorithmus.

viel Erfolg,
Christian

Edit: Verwendung von .Pixels auf .ScanLine geändert. Durchlaufgeschwindigkeit bei Vergleich von 500 Dateien mit 32x32px <120ms auf einem Core2Duo mit 2,4Ghz
Miniaturansicht angehängter Grafiken
zncc_mean_191.png   zncc_369.png  
Christian Nöding
  Mit Zitat antworten Zitat
Benutzerbild von rollstuhlfahrer
rollstuhlfahrer

Registriert seit: 1. Aug 2007
Ort: Ludwigshafen am Rhein
1.529 Beiträge
 
Delphi 7 Professional
 
#2

Re: Bildvergleich mit ZeroMeanNormalizedCross-Correlation (Z

  Alt 13. Dez 2009, 17:46
es wäre vielleicht noch besser, wenn man nicht nur quadratische Bilder vergleichen kann. Die meisten Bilder die man im Internet zu, Beispiel findet sind ja alle rechteckig. Gleiches gilt auch für den anderen Algorithmus.

Bernhard

PS: 100% (Rückgabewert 100) ist dann bei totaler Übereinstimmung?
Bernhard
Iliacos intra muros peccatur et extra!
  Mit Zitat antworten Zitat
Benutzerbild von christian.noeding
christian.noeding

Registriert seit: 26. Mai 2005
Ort: Knw.-Remsfeld
119 Beiträge
 
Delphi XE2 Professional
 
#3

Re: Bildvergleich mit ZeroMeanNormalizedCross-Correlation (Z

  Alt 13. Dez 2009, 18:57
Hi,

habe ja bei meinem anderen Codebeispiel auch schon geantwortet (siehe SSD). Algorithmus wird noch ausgebaut, wenn ich Zeit habe. Als erster Ansatz sollte das aber vielen schonmal ausreichen


Zitat:
PS: 100% (Rückgabewert 100) ist dann bei totaler Übereinstimmung?
Exakt - und das funktioniert auch gut.
Christian Nöding
  Mit Zitat antworten Zitat
anubis2k5

Registriert seit: 6. Jul 2008
13 Beiträge
 
#4

Re: Bildvergleich mit ZeroMeanNormalizedCross-Correlation (Z

  Alt 13. Dez 2009, 20:02
zum testen fehlt mir leider die Deklaration der Variable "Power"...
  Mit Zitat antworten Zitat
Benutzerbild von rollstuhlfahrer
rollstuhlfahrer

Registriert seit: 1. Aug 2007
Ort: Ludwigshafen am Rhein
1.529 Beiträge
 
Delphi 7 Professional
 
#5

Re: Bildvergleich mit ZeroMeanNormalizedCross-Correlation (Z

  Alt 13. Dez 2009, 22:00
Power ist keine Variable sondern eine Funktion. Diese sollte sich in der Unit Math befinden. Wenn nicht einfach mal danach suchen.

Bernhard

PS: Hier sollte es auch reichen einfach die Schleifen zu erweitern, oder?
Bernhard
Iliacos intra muros peccatur et extra!
  Mit Zitat antworten Zitat
Benutzerbild von christian.noeding
christian.noeding

Registriert seit: 26. Mai 2005
Ort: Knw.-Remsfeld
119 Beiträge
 
Delphi XE2 Professional
 
#6

Re: Bildvergleich mit ZeroMeanNormalizedCross-Correlation (Z

  Alt 14. Dez 2009, 08:16
Hi Bernhard,


Problem bei der Erweiterung der Schleife: die Mittelwertberechnung wird dann falsch, da hier von quadratischen Bildern ausgegangen wird. Hier müsste man eine andere Berechnungsvorschrift finden. Ist aber bestimmt möglich


ciao,
Christian
Christian Nöding
  Mit Zitat antworten Zitat
anubis2k5

Registriert seit: 6. Jul 2008
13 Beiträge
 
#7

Re: Bildvergleich mit ZeroMeanNormalizedCross-Correlation (Z

  Alt 14. Dez 2009, 13:05
Ach! An das neue Hilfesystem von Delphi muss ich mich erstmal noch gewöhnen...
  Mit Zitat antworten Zitat
bossberlin112

Registriert seit: 24. Aug 2010
1 Beiträge
 
#8

AW: Bildvergleich mit ZeroMeanNormalizedCross-Correlation (ZNCC)

  Alt 23. Jan 2013, 19:18
Hallo, leider funktioniert das ganze nicht.

Es gibt immer eine Exception hier:

for x:=0 to Bild1.Width-1 do
begin
summe1:=summe1+RGB2TColor(P1[y][x].rgbtRed, P1[y][x].rgbtGreen, P1[y][x].rgbtBlue);
summe2:=summe2+RGB2TColor(P2[y][x].rgbtRed, P2[y][x].rgbtGreen, P2[y][x].rgbtBlue);
end;

Ich möchte 2 Bilder vergleichen und den Prozentwert der Übereinstimmung bestimmen. Gibt's ne aktuellere Version bzw. ein Testprogramm, um evtl. Fehler auszuschließen?!

Derzeit bestimme ich die Anzahl unterschiedlicher Pixel über folgende Funktion, allerdings ist mir nicht ganz klar, wie ich hier den Korrelationskoeffizient bestimme etc. .... kann wer helfen?

Code:
function TForm1.CompareImages(Image1,Image2:TBitmap):Int64;
var x,y:integer;
   P1,P2:PRGBTripleArray;
   summe1,summe2:integer;
begin
  result := 0;
  summe1 := 0;
  summe2 := 0;
  for y := 0 to Image1.Height -1 do
   begin
     P1 := Image1.ScanLine[y];
     P2 := Image2.ScanLine[y];
       if not CompareMem(p1,p2,Image1.Width*SizeOf(TRGBTriple)) then
         begin
           for x := 0 to Image1.Width-1 do
             begin
               inc(summe1,RGB(P1[x].rgbtRed,P1[x].rgbtGreen,P1[x].rgbtBlue));
               inc(summe2,RGB(P2[x].rgbtRed,P2[x].rgbtGreen,P2[x].rgbtBlue));
               if summe1 <> summe2 then
                 begin
                   summe1 := 0;
                   summe2 := 0;
                   inc(result);
                 end;
             end;
         end;
   end;
  Application.ProcessMessages;
end;

Geändert von bossberlin112 (23. Jan 2013 um 19:21 Uhr)
  Mit Zitat antworten Zitat
bernhard_LA

Registriert seit: 8. Jun 2009
Ort: Bayern
1.138 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Bildvergleich mit ZeroMeanNormalizedCross-Correlation (ZNCC)

  Alt 23. Jan 2013, 23:55
für die einfache Cross Correlation gibt es unter http://sourceforge.net/p/nccfastncc/code/3/tree/trunk/ ein fertiges Demo Projekt zum testen.


Zero Mean Cross Correlation , bzw. Fast NCC sind dann die Erweiterungen zu obigem Projekt .
Durch die Weiterentwicklung von obigem Code konnten wir ~ 100 x schneller werden,
den Code kann ich leider nicht posten, war eine Auftragsarbeit.
  Mit Zitat antworten Zitat
Benutzerbild von christian.noeding
christian.noeding

Registriert seit: 26. Mai 2005
Ort: Knw.-Remsfeld
119 Beiträge
 
Delphi XE2 Professional
 
#10

AW: Bildvergleich mit ZeroMeanNormalizedCross-Correlation (ZNCC)

  Alt 19. Feb 2013, 09:36
Zitat:
Hallo, leider funktioniert das ganze nicht.

Es gibt immer eine Exception hier:
Hi,

Du musst natürlich noch die Pixelanzahl, also die Breite der Arrays P1,P2 und TRGBTripleArray anpassen. Im Beispiel ist es für ein 32x32 Pixel-Bild angegeben, weshalb das Array von 0 bis 31 geht. Wenn Du eine andere Größe verwendest, musst Du hier das Array anpassen.


viele Grüße,
Christian
Christian Nöding
  Mit Zitat antworten Zitat
Antwort Antwort


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 08:28 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