Es wurde hier schon des öfteren über das Vergleichen von zwei Farbwerten diskutiert.
Da sich weder
RGB (RGB-Probleme, wenig Berücksichtigung der menschlichen Farbwahrnehmung)
noch
HSV (Sprungstelle bei V von 360° zu 0°; bei Werten in der Nähe von schwarz und weiß werden S und V irrelevant, V ist in Graustufen undefiniert)
gut dazu eignen, möchte ich hier eine andere Variante vorstellen.
Es handelt sich hierbei um den
I1I2I3-Farbraum (Wikipedia).
(Warum dieser Farbraum so praktisch ist, erfährt man in Wikipedia
)
Als Funktion, die die Farbabweichung nun feststellen soll, sieht das ganze so aus:
Delphi-Quellcode:
function GetPixelAbweichung(Farbe1,Farbe2: TColor): Byte;
type
Farbwerte =
record
I1,I2,I3: Integer;
end;
var
R,G,B: Byte;
Farbe1I, Farbe2I, DeltaI: Farbwerte;
begin
R:=GetRValue(Farbe1);
G:=GetGValue(Farbe1);
B:=GetBValue(Farbe1);
Farbe1I.I1:=(R+G+B)
div 3;
// Umrechnung: RGB in I1I2I3
Farbe1I.I2:=(R-B)
div 2;
Farbe1I.I3:=(2*G-R-B)
div 4;
R:=GetRValue(Farbe2);
G:=GetGValue(Farbe2);
B:=GetBValue(Farbe2);
Farbe2I.I1:=(R+G+B)
div 3;
// Umrechnung: RGB in I1I2I3
Farbe2I.I2:=(R-B)
div 2;
Farbe2I.I3:=(2*G-R-B)
div 4;
DeltaI.I1:=Abs(Farbe1I.I1-Farbe2I.I1);
// Abweichung (Differenz) der Einzelwerte
DeltaI.I2:=Abs(Farbe1I.I2-Farbe2I.I2);
DeltaI.I3:=Abs(Farbe1I.I3-Farbe2I.I3);
Result:=Max(Max(DeltaI.I1,DeltaI.I2),DeltaI.I3);
// Maximale Abweichung
{Result:=Max(Abs(GetRValue(Farbe1)-GetRValue(Farbe2)), // (Das wäre Farbabweichung über RGB)
Max(Abs(GetGValue(Farbe1)-GetGValue(Farbe2)),
Abs(GetBValue(Farbe1)-GetBValue(Farbe2)))); }
end;
Anbei zwei Testprogramme, die mit dieser Funktion arbeiten: