Registriert seit: 26. Mai 2005
Ort: Knw.-Remsfeld
119 Beiträge
Delphi XE2 Professional
|
Bildvergleich mit Summe der quadratischen Unterschiede (SSD)
13. Dez 2009, 13:28
Ein kleiner, schneller Algorithmus, um Bilder miteinander zu vergleichen ist der SSD (Sum of Squared Differences) Algorithmus. Die Formel ist im Anhang zu diesem Post.
Das Bild wird zunächst in den L*a*b*-Farbraum umgerechnet, um das Bild nur über die Helligkeit eines Pixels zu vergleichen. Anschließend wird der Algorithmus ausgeführt. Der zurückgegebene Wert wird größer, je UNTERSCHIEDLICHER die Bilder sind.
Der SSD-Algorithmus ist allerdings nicht wirklich super. Besser ist der ZNCC, den ich ebenfalls hier in der CodeLib beschrieben habe ( Link zum ZNCC)
Delphi-Quellcode:
function SSD(Canvas1, Canvas2: TCanvas; Pixel:integer):Single;
var
x, y:integer;
Gamma, Intensity1, PixelValue1, Intensity2, PixelValue2:single;
R1, G1, B1, R2, G2, B2, Grayscale1, Grayscale2:byte;
MyColor1, MyColor2:TColor;
SSDvalue:Extended;
begin
SSDvalue:=0.0;
Gamma:=2.2;
for x:=0 to (Pixel-1) do
begin
for y:=0 to (Pixel-1) do
begin
MyColor1:=Canvas1.Pixels[x, y];
TColor2RGB(MyColor1, R1, G1, B1);
MyColor2:=Canvas2.Pixels[x, y];
TColor2RGB(MyColor2, R2, G2, B2);
// Graustufenbild 1 (Umrechnung auf L*a*b - Farbraum)
Intensity1:=0.2126 * Power(R1/255, Gamma) + 0.7152 * Power(G1/255, Gamma) + 0.0722 * Power(B1/255, Gamma);
Grayscale1:=255-round(116*Power(Intensity1, 1/3)-16);
PixelValue1:=Grayscale1/255;
// Graustufenbild 2 (Umrechnung auf L*a*b - Farbraum)
Intensity2:=0.2126 * Power(R2/255, Gamma) + 0.7152 * Power(G2/255, Gamma) + 0.0722 * Power(B2/255, Gamma);
Grayscale2:=255-round(116*Power(Intensity2, 1/3)-16);
PixelValue2:=Grayscale2/255;
// SumOfSquaredDifferences (SSD) (wird MINIMAL (<1) bei guter Übereinstimmung)
SSDvalue:=SSDvalue+Power((PixelValue1-PixelValue2), 2);
end;
end;
result:=SSDvalue;
end;
Christian Nöding
|
|
Zitat
|