-
обычного, не по Гауссу, для битмапов-24, в ДРКБ нету нормального ничего. функция должна быть настраиваемая
-
Чем Гаусс-то плох? Ну можно усреднять окрестность - сумма значений по квадрату или приближению круга разделить на количество точек в окне, если это кажется проще. На глаз особо не отличишь, если спецособенностей на картинке нет.
-
> Чем Гаусс-то плох?
Нет настроек: ветер, волны, взрыв, чупа-чупс и т.д. :)
-
> MBo © (12.04.12 05:43) [1]
ой, я перепутал Гаусс с радиальным размытием :)
-
> радиальным размытиемfunction ILimit(Val, AMin, AMax: Integer): Integer;
begin
Result := Min(Max(Val, AMin), AMax);
end;
function BLimit(B: Integer): Byte;
begin
if B < 0 then Result := 0
else if B > 255 then Result := 255
else Result := B;
end;
procedure RadialBlur(SrcBmp, DestBmp: TBitmap; CX, CY, Size, Quality: Integer);
const Rad = Pi/180;
var x, y, i, i2, Red, Green, Blue, px, py, nx, ny: Integer;
Dest: pByteArray;
Src: array of pByteArray;
ASin, ACos, Ang, A: Double;
begin
SetLength(Src, SrcBmp.Height);
i2 := Quality*Size;
A := 1/Quality;
for y := 0 to SrcBmp.Height - 1 do Src[y] := SrcBmp.ScanLine[y];
for y := 0 to DestBmp.Height - 1 do begin
Dest := DestBmp.ScanLine[y];
for x := 0 to DestBmp.Width - 1 do begin
Red := -Dest[x*3];
Green := -Dest[x*3+1];
Blue := -Dest[x*3+2];
px := x - cx;
py := y - cy;
ASin := (Cy + y)/Hypot(Cx + x, Cy + y);
Ang := ArcTan2(ASin, 1 - ASin*ASin) - Size div 2;
for i := 0 to i2 do begin
SinCos(Ang*Rad, ASin, ACos);
nx := ILimit(CX + Round(px*ACos - py*ASin), 0, SrcBmp.Width - 1)*3;
ny := ILimit(CY + Round(px*ASin + py*ACos), 0, SrcBmp.Height - 1);
Inc(Red, Src[ny][nx]);
Inc(Green, Src[ny][nx+1]);
Inc(Blue, Src[ny][nx+2]);
Ang := Ang + A;
end;
Dest[x*3] := BLimit(Red div i2);
Dest[x*3+1] := BLimit(Green div i2);
Dest[x*3+2] := BLimit(Blue div i2);
end;
end;
end;
-
> Омлет © (12.04.12 21:10) [4]
нет. мне нужно радиальное размытие, перечитайте вопрос. :) нужно обычное размытие хоть по Гауссу.
-
-
Хотя есть еще одни вариант Radial Blur - когда прогрессивно смазываются лучи, исходящие из какой-то точки.
-
-
> Омлет © (12.04.12 22:21) [6] > > > > нет. мне нужно радиальное размытие, перечитайте вопрос. > > > А я код для какого размытия привел?
нет, мне нужно обычное равномерное размытие. будто смотрим через матовое стекло
-
Ядро Гаусса разделяемое, так что можно применить фильтр по строкам, потом по столбцам
B[k] := Sum[i:=k - Size..k + Size](A[i]*Coeff[Abs(i-k)]) где коэффициенты считаются по формуле с экспонентой, либо как C(n,l)
Пример для окна размером 5 (Size = 2)
B[k] := (A[k-2] + 4*A[k-1] + 6*A[k] + 4*A[k+1] + A[k+2]) div 16
-
-
> Омлет © (13.04.12 08:22) [11] > > > > нет, мне нужно обычное равномерное размытие. > > То, что в Гуассовом размытии используется понятие радиуса, > не делает это размывание радиальным ))
это я уже понял, я уже говорил, что перепутал.
показанные вами картинки, показывают не тот результат, который мне нужен. на них радиальное размытие или подобное ею. мне нужна функция размытия под "матовое стекло".
-
> мне нужна функция размытия под "матовое стекло".
Ссылку я дал в [11].
-
> Омлет © (13.04.12 22:04) [13]
спасибо
-
-1'
-
1
-
1
-
1
-
-X
-
1
|