写了个用marr算子检测边缘的算法,感觉运行速度很慢啊,一副大约1000x1000像素的图片,要等约4秒多才运算完,不知道我写程序的方法对不?好象调用scanline会比较花时间。怎样能使运算速度快些呢?下面是放在dll中的代码。
我还发现个问题,在dll中似乎比放在主程序中速度还要慢点。 function Sharp(var MyBmp,newBmp:TBitmap;Threshold:integer):integer;stdcall;
var
x,y:integer;
xx,yy,i:integer;
itemp:integer;
p: array[-4..4] of PByteArray;
new_p: PByteArray; begin
for y := 4 to newBmp.Height - 1-4 do
begin
new_p:= newBmp.scanline[y];
for i:=-4 to 4 do
begin
p[i]:= MyBmp.scanline[y+i];
end; for x := 4 to newBmp.Width - 1-4 do
begin itemp:=0;
for yy:=-4 to 4 do
for xx:=-4 to 4 do //处理的是灰度图,
itemp:=itemp+Round(p[yy][(x+xx)*3]*marr4[yy][xx]); if(itemp>Threshold) then
itemp:=0
else
itemp:=255; new_p[x*3]:=itemp;
new_p[x*3+1]:=itemp;
new_p[x*3+2]:=itemp;
end;
end;
end;
我还发现个问题,在dll中似乎比放在主程序中速度还要慢点。 function Sharp(var MyBmp,newBmp:TBitmap;Threshold:integer):integer;stdcall;
var
x,y:integer;
xx,yy,i:integer;
itemp:integer;
p: array[-4..4] of PByteArray;
new_p: PByteArray; begin
for y := 4 to newBmp.Height - 1-4 do
begin
new_p:= newBmp.scanline[y];
for i:=-4 to 4 do
begin
p[i]:= MyBmp.scanline[y+i];
end; for x := 4 to newBmp.Width - 1-4 do
begin itemp:=0;
for yy:=-4 to 4 do
for xx:=-4 to 4 do //处理的是灰度图,
itemp:=itemp+Round(p[yy][(x+xx)*3]*marr4[yy][xx]); if(itemp>Threshold) then
itemp:=0
else
itemp:=255; new_p[x*3]:=itemp;
new_p[x*3+1]:=itemp;
new_p[x*3+2]:=itemp;
end;
end;
end;
procedure TImageProcessForm.MarrClick(Sender: TObject);
var
i,j:integer;
p1,p2,p3,p4,p5,p:pByteArray;
begin
self.DoubleBuffered := true; //采用双缓冲模式
TestBMP.Assign(WillbeChangedBmp);
ProcessedBmp.Assign(WillbeChangedBmp);
for j:=2 to TestBMP.Height-3 do
begin
p:=TestBMP.ScanLine[j];
p1:=ProcessedBmp.ScanLine[j-2];
p2:=ProcessedBmp.ScanLine[j-1];
p3:=ProcessedBmp.ScanLine[j];
p4:=ProcessedBmp.ScanLine[j+1];
p5:=ProcessedBmp.ScanLine[j+2];
for i:=2 to TestBMP.Width-3 do
begin
p[i*3]:=min(255,max(0,(
-2*p1[(i-2)*3]-4*p1[(i-1)*3]- 4*p1[i*3]-4*p1[(i+1)*3]-2*p1[(i+2)*3]
-4*p2[(i-2)*3] + 8*p2[i*3] -4*p2[(i+2)*3]
-4*p3[(i-2)*3]+8*p3[(i-1)*3]+24*p3[i*3]+8*p3[(i+1)*3]-4*p3[(i+2)*3]
-4*p4[(i-2)*3] + 8*p4[i*3] -4*p4[(i+2)*3]
-2*p5[(i-2)*3]-4*p5[(i-1)*3]- 4*p5[i*3]-4*p5[(i+1)*3]-2*p5[(i+2)*3])
));
p[i*3+1]:=min(255,max(0,(
-2*p1[(i-2)*3+1]-4*p1[(i-1)*3+1]-4*p1[i*3+1]-4*p1[(i+1)*3+1]-2*p1[(i+2)*3+1]
-4*p2[(i-2)*3+1]+8*p2[i*3+1]-4*p2[(i+2)*3+1]
-4*p3[(i-2)*3+1]+8*p3[(i-1)*3+1]+24*p3[i*3+1]+8*p3[(i+1)*3+1]-4*p3[(i+2)*3+1]
-4*p4[(i-2)*3+1]+8*p4[i*3+1]-4*p4[(i+2)*3+1]
-2*p5[(i-2)*3+1]-4*p5[(i-1)*3+1]-4*p5[i*3+1]-4*p5[(i+1)*3+1]-2*p5[(i+2)*3+1])
));
p[i*3+2]:=min(255,max(0,(
-2*p1[(i-2)*3+2]-4*p1[(i-1)*3+2]-4*p1[i*3+2]-4*p1[(i+1)*3+2]-2*p1[(i+2)*3+2]
-4*p2[(i-2)*3+2]+8*p2[i*3+2]-4*p2[(i+2)*3+2]
-4*p3[(i-2)*3+2]+8*p3[(i-1)*3+2]+24*p3[i*3+2]+8*p3[(i+1)*3+2]-4*p3[(i+2)*3+2]
-4*p4[(i-2)*3+2]+8*p4[i*3+2]-4*p4[(i+2)*3+2]
-2*p5[(i-2)*3+2]-4*p5[(i-1)*3+2]-4*p5[i*3+2]-4*p5[(i+1)*3+2]-2*p5[(i+2)*3]+2)
));
end;
end;
ChangedBmp.Assign(TestBMP);
ShowChangedBmp;
end;
procedure TImageProcessForm.MarrClick(Sender: TObject);
var
i,j:integer;
p1,p2,p3,p4,p5,p:pByteArray;
begin
self.DoubleBuffered := true; //采用双缓冲模式
TestBMP.Assign(WillbeChangedBmp);
ProcessedBmp.Assign(WillbeChangedBmp);
for j:=2 to TestBMP.Height-3 do
begin
p:=TestBMP.ScanLine[j];
p1:=ProcessedBmp.ScanLine[j-2];
p2:=ProcessedBmp.ScanLine[j-1];
p3:=ProcessedBmp.ScanLine[j];
p4:=ProcessedBmp.ScanLine[j+1];
p5:=ProcessedBmp.ScanLine[j+2];
for i:=2 to TestBMP.Width-3 do
begin
p[i*3]:=min(255,max(0,(
-2*p1[(i-2)*3]-4*p1[(i-1)*3]- 4*p1[i*3]-4*p1[(i+1)*3]-2*p1[(i+2)*3]
-4*p2[(i-2)*3] + 8*p2[i*3] -4*p2[(i+2)*3]
-4*p3[(i-2)*3]+8*p3[(i-1)*3]+24*p3[i*3]+8*p3[(i+1)*3]-4*p3[(i+2)*3]
-4*p4[(i-2)*3] + 8*p4[i*3] -4*p4[(i+2)*3]
-2*p5[(i-2)*3]-4*p5[(i-1)*3]- 4*p5[i*3]-4*p5[(i+1)*3]-2*p5[(i+2)*3])
));
p[i*3+1]:=min(255,max(0,(
-2*p1[(i-2)*3+1]-4*p1[(i-1)*3+1]-4*p1[i*3+1]-4*p1[(i+1)*3+1]-2*p1[(i+2)*3+1]
-4*p2[(i-2)*3+1]+8*p2[i*3+1]-4*p2[(i+2)*3+1]
-4*p3[(i-2)*3+1]+8*p3[(i-1)*3+1]+24*p3[i*3+1]+8*p3[(i+1)*3+1]-4*p3[(i+2)*3+1]
-4*p4[(i-2)*3+1]+8*p4[i*3+1]-4*p4[(i+2)*3+1]
-2*p5[(i-2)*3+1]-4*p5[(i-1)*3+1]-4*p5[i*3+1]-4*p5[(i+1)*3+1]-2*p5[(i+2)*3+1])
));
p[i*3+2]:=min(255,max(0,(
-2*p1[(i-2)*3+2]-4*p1[(i-1)*3+2]-4*p1[i*3+2]-4*p1[(i+1)*3+2]-2*p1[(i+2)*3+2]
-4*p2[(i-2)*3+2]+8*p2[i*3+2]-4*p2[(i+2)*3+2]
-4*p3[(i-2)*3+2]+8*p3[(i-1)*3+2]+24*p3[i*3+2]+8*p3[(i+1)*3+2]-4*p3[(i+2)*3+2]
-4*p4[(i-2)*3+2]+8*p4[i*3+2]-4*p4[(i+2)*3+2]
-2*p5[(i-2)*3+2]-4*p5[(i-1)*3+2]-4*p5[i*3+2]-4*p5[(i+1)*3+2]-2*p5[(i+2)*3]+2)
));
end;
end;
ChangedBmp.Assign(TestBMP);
ShowChangedBmp;
end;
应该先赋给一个局部变量p,每次都直接使用p不知道编译器会不会自动这样优化