本文,介绍一下,用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
缩小图片再检测的方法,有一个缺陷,那就是会降低图片质量,导致检测误差过大。
下一篇:Android系统调试串口新玩法