1
0
mirror of https://github.com/moparisthebest/Simba synced 2024-11-27 11:32:18 -05:00
Simba/Tests/PS/Gaussian.simba

90 lines
2.2 KiB
Plaintext

program new;
function BlurBMP( Bmp : TMufasaBitmap; N : integer; Sigma : extended) : TMufasaBitmap;
var
Matrix : T2DExtendedArray;
x,y,xx,yy : integer;
R,G,B : extended;
RR,GG,BB : integer;
mid : integer;
xmax,ymax : integer;
begin
Matrix := GaussMatrix(n,sigma);
result := GetMufasaBitmap(ConvoluteBitmap(bmp.Index,matrix));
end;
function BlurBMP2( Bmp : TMufasaBitmap; N : integer; Sigma : extended) : TMufasaBitmap;
var
Mat : TExtendedArray;
Values : Array of Array of Array[0..2] of Extended;
x,y,xx,yy : integer;
R,G,B : extended;
RR,GG,BB : integer;
mid : integer;
xmax,ymax : integer;
begin
Result := TMufasaBitmap.create;
result.SetSize(Bmp.Width,bmp.Height);
Setlength(Values,bmp.width);
for x := 0 to high(values) do
setlength(Values[x],bmp.height);
mid := (N*2-1)/2;
Mat := DiscreteGauss(-mid,mid,sigma);
xmax :=bmp.Width - 1 - mid;
ymax := bmp.height - 1 - mid;
for x := mid to xmax do
for y := mid to ymax do
begin
R := 0;
G := 0;
B := 0;
for xx := x to x + 2*mid do
begin
ColorToRGB(Bmp.FastGetPixel(xx-mid,y),RR,GG,BB);
r := r + RR * Mat[xx-x];
g := g + GG * Mat[xx-x];
b := b + BB * Mat[xx-x];
end;
Values[x][y][0] := r;
Values[x][y][1] := g;
Values[x][y][2] := b;
end;
for x := mid to xmax do
for y := mid to ymax do
begin
R := 0;
G := 0;
B := 0;
for yy := y to y + 2*mid do
begin
r := r + Values[x][yy-mid][0] * Mat[yy-y];
g := g + Values[x][yy-mid][1] * Mat[yy-y];
b := b + Values[x][yy-mid][2] * Mat[yy-y];
end;
Result.FastSetPixel(x,y,RGBtoColor(Round(R),Round(G),Round(B)));
end;
end;
var
s : extended;
sArr : TextendedArray;
Matrix : T2DExtendedArray;
i,ii : integer;
BMP : TMufasaBitmap;
BMP2 : TMufasaBitmap;
begin
BMP := TMufasaBitmap.create;
BMP.LoadFromFile('c:\rs.png');
i := GetSystemTime;
BMP2 := BlurBMP(BMP,2,0.9);
Writeln(GetSystemTime - i);
BMP2.SaveToFile( 'c:\rs2.bmp');
BMP2.Free;
i := GetSystemTime;
BMP2 := BlurBMP2(BMP,2,0.9);
Writeln(GetSystemTime-i);
BMP2.SaveToFile('c:\rs3.bmp');
BMP2.Free;
end.