多语言展示
当前在线:1265今日阅读:23今日分享:31

最原始的检测直线的算法实现——Hough变换

本文,介绍一下,用Hough变换来检测直线的算法的实现过程。主要目的是,认识算法的原理,并指出这种原始算法的不足之处。用的工具是Mathematica。
工具/原料
1

电脑

2

Mathematica

方法/步骤
1

给出一幅图片。

2

检测图片边界:img1 = EdgeDetect[img, 0.5]

4

提取图片数据,下图是图片数据的矩阵形式:data = ImageData[img2];data // MatrixForm;

5

把非零像素的像素坐标提取出来:data0 = Drop[  Flatten[Table[   If[data[[m, n]] > 0, {m, n}, 0], {m, 1, 200, 1}, {n, 1, 200, 1}],1] // Union, 1];data0 // Length

6

对每一个非零像素进行Hough变换:Table[Table[  If[(data0[[n]].{Cos[x], Sin[x]}) >     0, {data0[[n]].{Cos[x], Sin[x]} // N, x}, 0], {x, 0, Pi,    Pi/180}], {n, 1, data0 // Length, 1}]得到407612个数据组。

7

下面要对每一个数据组进行统计,统计它们各自在a里面出现的次数:b = Drop[a // Union, 1];d = a // Flatten;dd=Table[{b[[n]], SequenceCount[d, b[[n]]]}, {n, 1, b // Length, 1}]这一步实在是太耗费时间了,因此说,这个原始的算法计算量太大,根本不能用来检测直线;尤其是要实时检测的时候,根本不可能允许用长达数小时的时间,去检测一幅图片。本次试验就此暂停,待找到快速算法,再继续进行。

注意事项
1

Hough变换的原始算法,十分耗时,因此需要改进算法。

2

缩小图片再检测的方法,有一个缺陷,那就是会降低图片质量,导致检测误差过大。

推荐信息