Delphi使用Hough变换查找直线


本文整理自网络,侵删。

 Hough变换用来在图像中查找直线和圆,下面给出的一段程序,用来找出图像中最长的直线。该程序给出Hough变换的4种实现方法,分别采用了4种不同的模板:

          │-1   0    1│             │-1  -1  0│           │-1  -1  -1│            │0  -1  -1│
(1)│-1   0   1 │ (2) │-1   0  1│ (3)│ 0   0   0 │  (4)│1   0  -1│
          │-1   0   1 │             │ 0   1  1│           │ 1   1   1 │             │1  -1   0│


程序实现:


type
   TRGBArray = array[0..32767] of TRGBTriple;
   PRGBArray = ^TRGBArray;


procedure Hough(Bitmap: TBitmap; iMob: Integer; z: Word = 1);
//Bitmap:传入的位图,iMob:使用模板序号(取值:1-4),z:模板参数,取1
const
  Ray: array[1..4]of array[0..8] of Integer = (
    (-1, 0, 1,-1, 0, 1,-1, 0, 1),
    (-1,-1, 0,-1, 0, 1, 0, 1, 1),
    (-1,-1,-1, 0, 0, 0, 1, 1, 1),
    (0, -1,-1, 1, 0, -1,1,-1, 0));
var
  O, T, C, B: pRGBArray;
  i, x, y: Integer;
  tBuff: TBitmap;
begin
  i := Max(1, Min(4, iMob));
  tBuff := TBitmap.Create;
  tBuff.Assign(Bitmap);
  for x := 1 to Bitmap.Height - 2 do
  begin
    O := Bitmap.ScanLine[x];
    T := tBuff.ScanLine[x-1];
    C := tBuff.ScanLine[x];
    B := tBuff.ScanLine[x+1];
    for y := 1 to (Bitmap.Width - 2) do
    begin
      //红色分量
      O[y].rgbtRed := Max(0, Min(255, (
        T[y-1].rgbtRed * Ray[i][0] + T[y].rgbtRed * Ray[i][1] + T[y+1].rgbtRed * Ray[i][2] +
        C[y-1].rgbtRed * Ray[i][3] + C[y].rgbtRed * Ray[i][4] + C[y+1].rgbtRed * Ray[i][5] +
        B[y-1].rgbtRed * Ray[i][6] + B[y].rgbtRed * Ray[i][7] + B[y+1].rgbtRed * Ray[i][8]) div Z));
      //蓝色分量
      O[y].rgbtBlue := Max(0, Min(255, (
        T[y-1].rgbtBlue * Ray[i][0] + T[y].rgbtBlue * Ray[i][1] + T[y+1].rgbtBlue * Ray[i][2] +
        C[y-1].rgbtBlue * Ray[i][3] + C[y].rgbtBlue * Ray[i][4] + C[y+1].rgbtBlue * Ray[i][5] +
        B[y-1].rgbtBlue * Ray[i][6] + B[y].rgbtBlue * Ray[i][7] + B[y+1].rgbtBlue * Ray[i][8]) div Z));
      //绿色分量
      O[y].rgbtGreen := Max(0, Min(255, (
        T[y-1].rgbtGreen * Ray[i][0] + T[y].rgbtGreen * Ray[i][1] + T[y+1].rgbtGreen * Ray[i][2] +
        C[y-1].rgbtGreen * Ray[i][3] + C[y].rgbtGreen * Ray[i][4] + C[y+1].rgbtGreen * Ray[i][5] +
        B[y-1].rgbtGreen * Ray[i][6] + B[y].rgbtGreen * Ray[i][7] + B[y+1].rgbtGreen * Ray[i][8]) div Z));
    end;
  end;
  tBuff.Free;
end;

相关阅读 >>

Delphi中使用自定义字体

Delphi webbrowser1 execwb 复制 新建 打开

Delphi parent属性的另类用法

Delphi 获取网站验证码的图片

Delphi 使用 {$include} 或 {$i} 指令管理和调用自定义函数

Delphi搜索字符串在流中的位置

Delphi firemonkey应用程序取得控制的位置(坐标)的话

Delphi 另类计算程序代码运行耗时

Delphi datasnap 初步入门使用总结

Delphi 2010 复制整个文件夹(当然包括嵌套文件夹)

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



打赏

取消

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

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

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

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

评论

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