类似于Photoshop中的高斯模糊算法。(50分)

  • 主题发起人 主题发起人 yygw
  • 开始时间 开始时间
Y

yygw

Unregistered / Unconfirmed
GUEST, unregistred user!
很想知道Photoshop中的支持小数值的高斯模糊算法是如何实现的。
请给出具体的算法源码或相关网站(什么语言都可)。
 
其实那些图象处理算法无非就是利用了3×3的卷积模板来实现的。
高斯模糊算法的常用模板是 :

ray[0] := 3; ray[1] := 3; ray[2] := 3;
ray[3] := 3; ray[4] := 8; ray[5] := 3;
ray[6] := 3; ray[7] := 3; ray[8] := 3;
z := 32;

程序的编写 : 各个模板元素×各个模板对应图象的象素颜色分量的总和除以模板系数(在这里就是z)
 
自己去看吧!具体代码我不贴了(较长)。
http://www.vckbase.com/sourcecode/algorithms/
 
to: 卷起千堆雪tyn
卷积我也会,我的前段时间的工作就是图像识别,3X3的卷积效果太弱了。
除了卷积,还有另一种多次交叉模糊(忘了名字)的方法速度更快,效果更好。
但Photoshop中支持模糊度为0.2、1.3、10.8这样的高斯模糊啊!
to:YB_unique
那上面的代码都是常规的图像处理和变换算法。
我看了很多了,如前所述。
 
不知道FASTBMP中的高斯模糊用的是什么方法?请卷起千堆雪tyn说说看,贴一下它的原码:

procedure GaussianBlur(Bmp:TFastRGB;Amount:Integer);
var
i: Integer;
begin
for i:=Amount downto 1 do
SplitBlur(Bmp,i);
end;

function TrimInt(i,Min,Max:Integer):Integer;
begin
if i>Max then Result:=Max
else if i<Min then Result:=Min
else Result:=i;
end;

procedure SplitBlur(Bmp:TFastRGB;Amount:Integer);
var
Lin1,
Lin2: PLine;
pc: PFColor;
cx,x,y: Integer;
Buf: array[0..3]of TFColor;
begin
pc:=Bmp.Bits;
for y:=0 to Bmp.Height-1 do
begin
Lin1:=Bmp.Pixels[TrimInt(y+Amount,0,Bmp.Height-1)];
Lin2:=Bmp.Pixels[TrimInt(y-Amount,0,Bmp.Height-1)];
for x:=0 to Bmp.Width-1 do
begin
cx:=TrimInt(x+Amount,0,Bmp.Width-1);
Buf[0]:=Lin1[cx];
Buf[1]:=Lin2[cx];
cx:=TrimInt(x-Amount,0,Bmp.Width-1);
Buf[2]:=Lin1[cx];
Buf[3]:=Lin2[cx];
pc.b:=(Buf[0].b+Buf[1].b+Buf[2].b+Buf[3].b)shr 2; //我想就是这里了,能说说位操作在图象计算中的运用
pc.g:=(Buf[0].g+Buf[1].g+Buf[2].g+Buf[3].g)shr 2;
pc.r:=(Buf[0].r+Buf[1].r+Buf[2].r+Buf[3].r)shr 2;
Inc(pc);
end;
pc:=Ptr(Integer(pc)+Bmp.Gap);
end;
end;


 
这正是我上面提到的第二种方法(叫什么名字?)
类似的代码我见过好几次,特别是SplitBlur很常见,如果单独用什么都不象,这种算法效果好象比卷积要好。
就不知怎样支持“无级”模糊。
上面的位操作很简单,就是取平均值。
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
896
SUNSTONE的Delphi笔记
S
S
回复
0
查看
873
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
后退
顶部