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;

相关阅读 >>

Delphi 限制tedit控件只能输入数字,小数点和负号

Delphi 实现从下载链接提取文件名的函数

Delphi memo1 行随机打乱

Delphi webbrowser.oleobject属性

Delphi tserversocket 发送消息之前检查客户端是否仍处于连接状态

Delphi -- gdi+ Delphi如何让 tgpimage 直接从流中加载图片

Delphi edit 让密码变成点

Delphi windows 编程[5] - 学习窗体生成的过程五

Delphi 单击最小化按钮隐藏单击托盘显示

Delphi xe5 android listview

更多相关阅读请进入《Delphi》频道 >>



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...