上一篇:Delphi单元文件转Html代码
下一篇:Delphi基于Prewitte算子的图像边缘检测

Delphi基于高斯-拉普拉斯算子的图像边缘检测

发布于: 2013/1/24 7:59:11   |  发布在: Delphi文章   |  点击:

由于噪声点对边缘检测有一定的影响,所以效果更好的边缘检测器是高斯拉普拉斯(LOG)算子,它把高斯平滑滤波器和拉普拉斯锐化滤波器结合了起来,先平滑掉噪声,再进行边缘检测,所以效果会更好。常用的LOG算子是5X5的模板,如下所示:
│-2  -4  -4  -4  -2│
│-4   0   8   0   -4│
│-4   8   4   8   -4│
│-4   0   8   0   -4│
│ 2  -4  -4  -4  -2│

程序实现:

procedure Gauss_Laplace(Bitmap: TBitmap);
var
  bmp1, bmp2: TBitmap;
  p, a1, a2, a3, a4, a5: pByteArray;
  i, j: Integer;
begin
  bmp1 := TBitmap.Create;
  bmp2 := TBitmap.Create;
  bmp1.Assign(Bitmap);
  bmp1.PixelFormat := pf24bit;
  bmp1.Width := Bitmap.Width;
  bmp1.Height := Bitmap.Height;
  bmp2.Assign(Bitmap);
  bmp2.PixelFormat := pf24bit;
  for j:=2 to bmp1.Height - 3 do
  begin
    p := bmp1.ScanLine[j];
    a1:= bmp2.ScanLine[j-2];
    a2 := bmp2.ScanLine[j-1];
    a3 := bmp2.ScanLine[j];
    a4 := bmp2.ScanLine[j+1];
    a5 := bmp2.ScanLine[j+2];
    for i:=2 to bmp1.Width - 3 do
    begin
      p[3*i+2] := Min(255, Max(0, (
            -2*a1[3*(i-2)+2]-4*a1[3*(i-1)+2]-4*a1[3*i+2]-4*a1[3*(i+1)+2]-2*a1[3*(i+2)+2]
            -4*a2[3*(i-2)+2]+0*a2[3*(i-1)+2]+8*a2[3*i+2]+0*a2[3*(i+1)+2]-4*a2[3*(i+2)+2]
            -4*a3[3*(i-2)+2]+8*a3[3*(i-1)+2]+4*a3[3*i+2]+8*a3[3*(i+1)+2]-4*a3[3*(i+2)+2]
            -4*a4[3*(i-2)+2]+0*a4[3*(i-1)+2]+8*a4[3*i+2]+0*a4[3*(i+1)+2]-4*a4[3*(i+2)+2]
            +2*a5[3*(i-2)+2]-4*a5[3*(i-1)+2]-4*a5[3*i+2]-4*a5[3*(i+1)+2]-2*a5[3*(i+2)+2])));
      p[3*i+1] := Min(255, Max(0, (
            -2*a1[3*(i-2)+1]-4*a1[3*(i-1)+1]-4*a1[3*i+1]-4*a1[3*(i+1)+1]-2*a1[3*(i+2)+1]
            -4*a2[3*(i-2)+1]+0*a2[3*(i-1)+1]+8*a2[3*i+1]+0*a2[3*(i+1)+1]-4*a2[3*(i+2)+1]
            -4*a3[3*(i-2)+1]+8*a3[3*(i-1)+1]+4*a3[3*i+1]+8*a3[3*(i+1)+1]-4*a3[3*(i+2)+1]
            -4*a4[3*(i-2)+1]+0*a4[3*(i-1)+1]+8*a4[3*i+1]+0*a4[3*(i+1)+1]-4*a4[3*(i+2)+1]
            +2*a5[3*(i-2)+1]-4*a5[3*(i-1)+1]-4*a5[3*i+1]-4*a5[3*(i+1)+1]-2*a5[3*(i+2)+1])));
      p[3*i] := Min(255, Max(0, (
            -2*a1[3*(i-2)]-4*a1[3*(i-1)]-4*a1[3*i]-4*a1[3*(i+1)]-2*a1[3*(i+2)]
            -4*a2[3*(i-2)]+0*a2[3*(i-1)]+8*a2[3*i]+0*a2[3*(i+1)]-4*a2[3*(i+2)]
            -4*a3[3*(i-2)]+8*a3[3*(i-1)]+4*a3[3*i]+8*a3[3*(i+1)]-4*a3[3*(i+2)]
            -4*a4[3*(i-2)]+0*a4[3*(i-1)]+8*a4[3*i]+0*a4[3*(i+1)]-4*a4[3*(i+2)]
            +2*a5[3*(i-2)]-4*a5[3*(i-1)]-4*a5[3*i]-4*a5[3*(i+1)]-2*a5[3*(i+2)])));
    end;
  end;
  Bitmap.Assign(bmp1);
  bmp1.Free;
  bmp2.Free;
end;

高斯-拉普拉斯算子边缘检测