
上QQ阅读APP看书,第一时间看更新
3.10.1 检测线
首先,我们来检测一些线,这可以用HoughLines函数或者HoughLinesP函数实现。HoughLines函数使用标准霍夫变换,而HoughLinesP函数使用概率霍夫变换(因此名称中有P)。之所以称作概率霍夫变换,是因为它只分析图像点的子集,并估计这些点属于同一条线的概率。它是标准霍夫变换的优化版本,计算强度更小,执行速度更快。HoughLinesP的实现返回每个检测线段的两个端点,而HoughLines的实现返回每条线,表示形式为一个单点和一个角度,不包含端点的信息。
我们来看一个非常简单的例子:


这个简单脚本的关键部分(除了HoughLines函数调用)是设置最小线段长度(丢弃较短的线)和最大线段间距(即将两条线段视为单独线段之前,线段的最大间距)。
同时,请注意,HoughLines函数采用单通道二值图像,并通过Canny边缘检测滤波器进行处理。Canny并非严格要求,但是已经去噪且只表示边缘的图像是霍夫变换的理想源,所以你会发现这是一种常见的做法。
HoughLinesP的参数如下:
·图像。
·搜索线时使用的分辨率或者步长。rho是以像素为单位的位置步长,而theta是以弧度为单位的旋转步长。例如,如果指定rho=1且theta=np.pi/180.0,则搜索的线之间的间隔只有1像素和1度。
·threshold表示丢弃低于该阈值的线。霍夫变换类似于箱和投票的系统,每个箱表示一条线,如果候选线至少拥有阈值数的选票就保留,否则就将其丢弃。
·minLineLength和maxLineGap,如前所述。