RSS订阅 | 匿名投稿
您的位置:网站首页 > 图像 > 正文

Delphi基于Sobel算子的图像边缘检测

作者:admin 来源: 日期:2016/1/26 21:52:25 人气: 标签:

在边沿检测中,常用的一种模板是Sobel算子,有两个,一个是检测水平边沿的,一个是检测垂直边沿的:

│-1  -2  -1│      │-1  0  1│
│ 0   0   0 │ 和 │-2  0  2│
│ 1   2   1 │      │-1  0  1│

procedure Sobel(Bitmap: TBitmap);
var
   bmp1, bmp2: Tbitmap;
   p1, p3, p2, p4: pByteArray;
   i, j: integer;
   r, g, b: Byte;
begin
   bmp1 := Tbitmap.Create;
   bmp2 := Tbitmap.Create;
   bmp1.Assign(Bitmap);
   bmp1.PixelFormat := pf24bit;
   bmp2.Assign(bmp1);
   bmp2.PixelFormat := pf24bit;
   for j := 1 to bmp1.Height - 2 do
   begin
      p1 := bmp1.ScanLine[j];
      p2 := bmp2.ScanLine[j - 1];
      p3 := bmp2.ScanLine[j];
      p4 := bmp2.ScanLine[j + 1];
      for i := 1 to bmp1.Width - 2 do
      begin   // 采用检测垂直边缘的sobel算子[-1,-2,-1; 1,0,0,0; 1,2,1]
         r := min(255, max(0,((
                 -p2[3 * (i - 1) + 2] - 2 * p2[3 * i + 2] - p2[3 * (i + 1) + 2]
                 - 0 * p3[3 * (i - 1) + 2] + 0 * p3[3 * i + 2] - 0 * p3[3 * (i + 1)+ 2]
                 + p4[3 * (i - 1) + 2] + 2 * p4[3 * i + 2] + p4[3 * (i + 1) + 2])
               )));
         g := min(255, max(0, ((
                 -p2[3 * (i - 1) + 1] - 2 * p2[3 * i + 1] - p2[3 * (i + 1) + 1]
                 - 0 * p3[3 * (i - 1) + 1] + 0 * p3[3 * i + 1] - 0 * p3[3 * (i + 1) + 1]
                 + p4[3 * (i - 1) + 1] + 2 * p4[3 * i + 1] + p4[3 * (i + 1) + 1])
               )));
         b := min(255, max(0, ((
                 -p2[3 * (i - 1)] - 2 * p2[3 * i] - p2[3 * (i + 1)]
                 - 0 * p3[3 * (i - 1)] + 0 * p3[3 * i] - 0 * p3[3 * (i + 1)]
                 + p4[3 * (i - 1)] + 2 * p4[3 * i + 2] + p4[3 * (i + 1)])
               )));
         //采用检测水平边缘的sobel算子[-1,0,1; -2,0,2; -1,0,1]
         p1[3 * i + 2] := min(255, max(0, ((
                 -p2[3 * (i - 1) + 2] + 0 * p2[3 * i + 2] + p2[3 * (i + 1) + 2]
                 - 2 * p3[3 * (i - 1) + 2] + 0 * p3[3 * i + 2] + 2 * p3[3 * (i + 1) + 2]
                 - p4[3 * (i - 1) + 2] - 0 * p4[3 * i + 2] + p4[3 * (i + 1) + 2])
               )));
         p1[3 * i + 1] := min(255, max(0, ((
                 -p2[3 * (i - 1) + 1] + 0 * p2[3 * i + 1] + p2[3 * (i + 1) + 1]
                 - 2 * p3[3 * (i - 1) + 1] + 0 * p3[3 * i + 1] + 2 * p3[3 * (i + 1) + 1]
                 - p4[3 * (i - 1) + 1] - 0 * p4[3 * i + 1] + p4[3 * (i + 1) + 1])
               )));
         p1[3 * i] := min(255, max(0, ((
                 -p2[3 * (i - 1)] + 0 * p2[3 * i] + p2[3 * (i + 1)]
                 - 2 * p3[3 * (i - 1)] + 0 * p3[3 * i] + 2 * p3[3 * (i + 1)]
                 - p4[3 * (i - 1)] - 0 * p4[3 * i] + p4[3 * (i + 1)])
               )));
         p1[3 * i + 2] := (max(r, p1[3 * i + 2]));
         p1[3 * i + 1] := (max(g, p1[3 * i + 1]));
         p1[3 * i] := (max(b, p1[3 * i]));
      end;
   end;
   Bitmap.Assign(bmp1);
   bmp2.Free;
   Bmp1.Free;
end;

读完这篇文章后,您心情如何?
0
0
0
0
0
0
0
0
本文网址:
下一篇:没有资料