Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi "Verfärbte" Bilder vergleichen. (https://www.delphipraxis.net/81402-verfaerbte-bilder-vergleichen.html)

Relicted 26. Nov 2006 16:20


"Verfärbte" Bilder vergleichen.
 
Liste der Anhänge anzeigen (Anzahl: 3)
Mahlzeit!

Ich suche momentan nach ner kleinen hilfestellung. ich habe n bilder die ansich alle gleich sind. sie unterscheiden sich nur in der farbgebung. das objekt ansich ist 100% gleich.
mich würde interessieren ob es möglich ist, und wenn möglich auch wie, diese bilder zu vergleichen.

ich habe hier ein bildchen mal so manipuliert wie es auch in realität auftreten könnte - vielleicht hat hier ja wer ne idee.

zum vergleichen habe ich schon hier geschaut - müsste sie aber erstmal auf ein format bekommen um sie vergleichen zu können.
( http://www.delphipraxis.net/internal...ct.php?t=96369 )

gruß
reli

Sascha L 26. Nov 2006 16:46

Re: "Verfärbte" Bilder vergleichen.
 
Ich weiß nicht, ob es klappt, aber müssten die Bilder in Schwarz/weiß, also Graustufen nicht identisch aussehen? Also wenn sie sich nur in der Farbe unterscheiden, würde ich halt einfach alle Farben runtersetzen, sodass man nur noch den Kontrast hat. Da die Form ja identisch ist, müssten alle Bilder dann gleich sein.

Relicted 26. Nov 2006 16:55

Re: "Verfärbte" Bilder vergleichen.
 
hm ja die idee ist mir auch schon gekommen... die frage ist how to do :o)

Flare 26. Nov 2006 17:03

Re: "Verfärbte" Bilder vergleichen.
 
Man könnte ein grobes Schwarz-Weis-Muster von den beiden Bildern anlegen und diese dann vergleichen. Sobald eine der 3 Farben über 127 ist (oder eben eine andere Zahl von 0 bis 255), dann wird der Pixel weiß, ansonsten schwarz.


Flare

Khabarakh 26. Nov 2006 17:14

Re: "Verfärbte" Bilder vergleichen.
 
Ich würde eher die Werte in den HSV-Farbraum (vielleicht auch HSL/HSB/HSI) umrechnen und dann die V- und S-Werte vergleichen. Du solltest uns aber schon ein bisschen mehr Informationen geben, ob die Bilder beispielsweise künstlich erzeugt werden oder wirklich verschiedenfarbige Fotos sind.

Phantom1 26. Nov 2006 17:26

Re: "Verfärbte" Bilder vergleichen.
 
Hier mein Vorschlag:

Delphi-Quellcode:
function CompareBitmaps(Bitmap1, Bitmap2: TBitmap): Double;
var
  xy: integer;
  P1, P2: PRGBTriple;
  g1, g2: Byte;
  PixelWeight: Double;
begin
  Result:=100.0;
  PixelWeight:=100/(Bitmap1.Width*Bitmap1.Height)/255;
  Bitmap1.PixelFormat:=pf24bit;
  Bitmap2.PixelFormat:=pf24bit;
  P1:=Bitmap1.ScanLine[Bitmap1.Height-1];
  P2:=Bitmap2.ScanLine[Bitmap2.Height-1];
  for xy:=1 to Bitmap1.Height*Bitmap1.Width do begin
    g1:=(P1^.rgbtRed+P1^.rgbtGreen+P1^.rgbtBlue) div 3;
    g2:=(P2^.rgbtRed+P2^.rgbtGreen+P2^.rgbtBlue) div 3;
    Result:=Result-ABS(g1-g2)*PixelWeight;
    Inc(P1);
    Inc(P2);
  end;
end;
Verglichen wird hier nur die Helligkeit und gibt als Ergebnis die Ähnlichkeit in Prozent an. Man müsste dann nur noch entscheiden ab wieviel Prozent die Bilder als gleich gelten...

mfg

Relicted 26. Nov 2006 17:31

Re: "Verfärbte" Bilder vergleichen.
 
hört sich gut an...

mehr infos kann ich gar nicht geben. ich denke es ist immer ein bild welches via script ( php or what ever ) die farbe ändert

danke schonmal für die nützlichen hinweise!

gruß
reli

alzaimar 26. Nov 2006 18:03

Re: "Verfärbte" Bilder vergleichen.
 
Wie sieht eigentlich die Differenz der beiden Bilder aus? Wären sie absolut gleich, würde das Diffenz schwarz sein. Und hier?

Relicted 26. Nov 2006 18:14

Re: "Verfärbte" Bilder vergleichen.
 
*mit den schultern zuck*
keine ahnung muss ich passen

alzaimar 26. Nov 2006 18:21

Re: "Verfärbte" Bilder vergleichen.
 
Ich habe mal die Differenz der beiden in Graustufen konvertierten Bilder gemacht: Voilá, schwarz wie die Nacht (bis auf ein paar klitzekleine grauen Linien).

Delphi-Quellcode:
Var
  c1,c2,x,p,q,i,j : Integer;
  b1,b2 : TBitmap;
  r : TRect;

begin
  b1 := TBitmap.create;
  b2 := TBitmap.create;
  r := rect (0,0,image1.width, image1.height);
  b1.width := image1.width;
  b1.Height := image1.Height;
  b2.width := image1.width;
  b2.Height := image1.Height;

  b1.Canvas.Draw(0,0,image1.Picture.Graphic);
  b2.Canvas.Draw(0,0,image2.Picture.Graphic);

  Image3.Width := image1.Width;
  image3.Height := Image1.Height;
  For i:=0 to image1.Height - 1 do
    for j:=0 to image1.Width - 1 do begin
      p := b1.Canvas.Pixels[j,i];
      q := b2.Canvas.Pixels[j,i];
      c1 := (GetRValue(p) + GetGValue(p) + GetBValue(p)) div 3;
      c2 := (GetRValue(q) + GetGValue(q) + GetBValue(q)) div 3;
      c1 := abs(c1 - c2);
      x := rgb ( c1,c1,c1);
      image3.Canvas.Pixels[j,i] := X;
      End;
  b1.free;
  b2.free;
end;
Bitte nicht steinigen, weil ich alle Grundsätze guten Codes über Bord geworfen habe.

Relicted 26. Nov 2006 18:30

Re: "Verfärbte" Bilder vergleichen.
 
gesteinigt wird hier eh keiner :)
höchstens erhängt, geköpft, gemartert oder sonst was :))

ich hab gerade mal phantom's algo getestet... funktioniert sehr gut. bekomme eine übereinstimmung von 95% bei beiden fakes. works fine :-)

alza deinen algo könnte man vllt noch vereinfachen wenn man einfach nen TImage nimmt und ihm ne 1bit farbrange gibt oder versteh ich grad bissl was falsch? :-)

gruß
reli

alzaimar 26. Nov 2006 19:44

Re: "Verfärbte" Bilder vergleichen.
 
Wenn der Algorithmus von Phantom gut ist, nimm den doch: Ich hab mich eh nur für einen visuellen Vergleich interessiert. Bei einer Konvertierung auf 1bit Farbtiefe könnte es aber sein, das das nicht mehr funktioniert.
Zitat:

Zitat von Relicted
gesteinigt wird hier eh keiner :)
höchstens erhängt, geköpft, gemartert oder sonst was :))

Mag ich eh lieber. :mrgreen: Das Steinigen hängt mir langsam zum Halse raus. Immer diese falschen Bärte...

marabu 26. Nov 2006 20:35

Re: "Verfärbte" Bilder vergleichen.
 
Hi,

nur weil ich über die identische Grauwert-Berechnung in den beiden Codes von Phantom und alzaimar gestolpert bin: Der Grauwert ist nicht der Mittelwert aus den Farbanteilen im RGB-Farbraum. Um den Grauwert zu erhalten bildet man RGB in den NTSC Farbraum ab (wegen der Trennung von Farbe und Helligkeit in YUV) und schmeißt die Farbe weg, bevor man wieder in den RGB-Farbraum zurück übersetzt. Diese Funktion könnte dabei helfen:

Delphi-Quellcode:
function GrayValue(rgb: PRGBTriple): Integer;
begin
  Result := Round(rgb.rgbtRed * 0.299 + rgb.rgbtgreen * 0.587 + rgb.rgbtblue * 0.114);
end;
Ansonsten ist ein einfaches gray scale Differenzbild bei ungleichmäßiger Verfärbung (gealterte Fotos) nicht sehr aussagefähig, aber wenn hier künstlich verfärbte Bilder (sepia operator) vorliegen, dann reicht das aus. Informationsgleichheit ist dann gegeben, wenn ein Bild mit annähernd konstantem Grauwert als Differenzbild heraus kommt. Oder man berechnet das Schwarz-Weiß-Bild mit einem statischen Schwellwert und erhält ein annähernd schwarzes Differenzbild. Was da vorteilhafter ist hängt wohl davon ab, wie man die Auswertung des Differenzbildes implementiert.

Gute Nacht

Phantom1 27. Nov 2006 08:36

Re: "Verfärbte" Bilder vergleichen.
 
Zitat:

Zitat von marabu
nur weil ich über die identische Grauwert-Berechnung in den beiden Codes von Phantom und alzaimar gestolpert bin: Der Grauwert ist nicht der Mittelwert aus den Farbanteilen im RGB-Farbraum. Um den Grauwert zu erhalten bildet man RGB in den NTSC Farbraum ab (wegen der Trennung von Farbe und Helligkeit in YUV) und schmeißt die Farbe weg, bevor man wieder in den RGB-Farbraum zurück übersetzt. Diese Funktion könnte dabei helfen:

Delphi-Quellcode:
function GrayValue(rgb: PRGBTriple): Integer;
begin
  Result := Round(rgb.rgbtRed * 0.299 + rgb.rgbtgreen * 0.587 + rgb.rgbtblue * 0.114);
end;

Mir ist die Formel auch bekannt, ist aber bei diesem Bildvergleich unnutz. Diese Art der Berechnung der Helligkeit ist nur für das menschliche Auge gedacht (da es grün heller empfindet als rot und das wiederum heller als blau), hier wird jedoch alles nur intern berechnet. Hinzu kommt noch das die Bilder Farbverfälschungen besitzen, somit ist die korrekte Herstellung des Grauwertes eh nicht gegeben.

mfg

alzaimar 27. Nov 2006 18:45

Re: "Verfärbte" Bilder vergleichen.
 
Hallo marabu,

Die von Dir genannte 'korrekte' Grauwerttransformation findet bei meinem ästhetischen Empfinden keine Zustimmung. Hier hat die Mittelwertbildung für mich die besten Resultate gebracht. Kann aber auch an meiner Brille liegen :mrgreen:


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:43 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