有谁可以写出快速柔化算法 ( 积分: 200 )

  • 主题发起人 主题发起人 FishEatsCats
  • 开始时间 开始时间
F

FishEatsCats

Unregistered / Unconfirmed
GUEST, unregistred user!
柔化算法,至少在视觉看来是连续的
var red,green,blue,m,n:integer;
begin
for i:=step to x-1-step do begin
for j:=step to y-1-step do begin
red:=srgb[doing,i-step,j-step].r+srgb[doing,i-step,j].r+srgb[doing,i-step,j+step].r+srgb[doing,i,j-step].r+srgb[doing,i,j].r+srgb[doing,i,j+step].r+srgb[doing,i+step,j-step].r+srgb[doing,i+step,j].r+srgb[doing,i+step,j+step].r;
blue:=srgb[doing,i-step,j-step].b+srgb[doing,i-step,j].b+srgb[doing,i-step,j+step].b+srgb[doing,i,j-step].b+srgb[doing,i,j].b+srgb[doing,i,j+step].b+srgb[doing,i+step,j-step].b+srgb[doing,i+step,j].b+srgb[doing,i+step,j+step].b;
green:=srgb[doing,i-step,j-step].g+srgb[doing,i-step,j].g+srgb[doing,i-step,j+step].g+srgb[doing,i,j-step].g+srgb[doing,i,j].g+srgb[doing,i,j+step].g+srgb[doing,i+step,j-step].g+srgb[doing,i+step,j].g+srgb[doing,i+step,j+step].g;
with srgb[1-doing,i,j] do begin
r:=red div 9;
b:=blue div 9;
g:=green div 9;
end;
DXDraw1.Surface.Canvas.Pixels [i,j]:=rgb(red div 9,green div 9,blue div 9);
end;

end;
DXDraw1.Surface.Canvas.Release ;
DXDraw1.Flip ;
inc(step);
Doing:=1-Doing;
这个算法在200*200速度还可以,但是在700*700下就有问题了
本人考虑可以用多线程进行局部柔化不知各位有什么高见
 
完成赞成 多线程进行局部柔化
 
都开了50个线程同时柔化了
For i:=1 to C do begin
hthread:=CreateThread(nil,0,@MyThreadfunc,nil,0,ThreadID);
if hThread=0 then
messagebox(Handle,'Didn’tCreateaThread',nil,MB_OK);
end;

function MyThreadFunc(P:pointer):Longint;stdcall;
var
x,y:integer;
Color:TCOlor;
R,G,B:Integer;
i,j:Integer;
begin
repeat
x:=random(Form1.W-2 )+1;
y:=random(Form1.H-2)+1;

with form1.canvas do
begin
lock;
try
R:=0;
B:=0;
G:=0;
for i:=-1 to 1 do
for j:=-1 to 1 do
begin
Color:=Pixels [x+i,y+j];
Inc(R,GetRValue(Color));
Inc(G,GetGValue(Color));
Inc(B,GetBValue(Color));
end;
Pixels [x,y]:=RGB(R DIV 9,G DIV 9,B DIV 9) ;
finally
Unlock;
end;
end;
until ending;{自定义的结束标志}
end;

是否还要用GetDC,直接用API进行加速操作?效果相当不明显
 
看代码就知道慢了,而且还是 GDI+DX 操作,还要用除法指令.

优化的话可以用 MMX 重写一个.
 
..........等你写的代码呢~~~~~~不要忘了加上MMX优化阿
我认为因该有更好的柔化算法
 
写下算法看看,有时间的话就写。
 
先谢谢你咯~~~~~~~~~`学习ing
 
算法贴出来看看?你的代码太...看不太懂.
 
.......我的代码太肤浅了,惭愧
你从头写啦,显示用什么都可以OpenGL,DirectX,GDI随便
只需要平滑柔化的效果出来就可以了
至少是700*500的图片就可以了
核心算法极其简单,(i,j)点的颜色是周围9个点的平均值
 
分析一下这种算法的时间复杂度,看看有多大的提升空间吧
对于一个纯循环,以现在的单核计算机,大概1.5亿/s
700*700图片,原来一桢一桢全图柔化显示的算法
O(k*图片面积*9*4),k为程序系数,暂取3,这样
3*700*700*9*4=52920000,这是不可能达到的,即使程序达到这个复杂度,也只能没秒3桢
要平滑,至少每秒24桢
用多线程,如果是简单的随机多线程,至少随机图上40%的点,这样也不到24桢每秒
随机柔化,只是让图片更平滑,但是速度慢
本人正在努力思考中........必须采用有损算法
 
就是说,比如有9点个
123
456
789

那么,5的颜色就是 1+2+3+4+6+7+8+9 / 8 (旁边9个点?不是只有8个?)
 
上完课了,可以减少数据工作量的,以前的纯图形计算现在想想可能行的通
对于每一行,计算下一个点时候,有6各点是重复计算的
这样修改桢数可以上升三倍,关于TColor有更好的计算方法吗?
 
后退
顶部