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


Prewitte算子采用的是两个模板:

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

分别处理后得到的像素点的较大值。

procedure Prewitte(Bitmap: TBitmap);
var
 bmp1, bmp2: Tbitmap;
 p1, p3, p2, p4: pbytearray;
 i, j: integer;
 r, g, b: integer;
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
 r := min(255, max(0, ((
 -p2[3 * (i - 1) + 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] + p4[3 * i + 2] + p4[3 * (i + 1) + 2]))));
 g := min(255, max(0, ((
 -p2[3 * (i - 1) + 1] - 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] + p4[3 * i + 1] + p4[3 * (i + 1) + 1]))));
 b := min(255, max(0, ((
 -p2[3 * (i - 1)] - 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)] + p4[3 * i + 2] + p4[3 * (i + 1)]))));
 begin
 p1[3 * i + 2] := min(255, max(0, ((
 p2[3 * (i - 1) + 2] - 0 * p2[3 * i + 2] - p2[3 * (i + 1) + 2]
 + p3[3 * (i - 1) + 2] + 0 * p3[3 * i + 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]
 + p3[3 * (i - 1) + 1] + 0 * p3[3 * i + 1] - 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)]
 + p3[3 * (i - 1)] + 0 * p3[3 * i] - 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;
 end;
 Bitmap.Assign(bmp1);
 Bmp1.Free;
 bmp2.Free;
end;

联系电话:
020-00000000
联系电话:
020-00000000
联系电话:
020-12345678