写了个用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;

解决方案 »

  1.   

    给你贴个高人写的处理marr的代码你看看 速度很快的
    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;
      

  2.   

    弄错了 重新贴
    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;
      

  3.   

    (i-2)*3 重复这么多遍?
    应该先赋给一个局部变量p,每次都直接使用p不知道编译器会不会自动这样优化