opencv Python 详述
霍夫直线检测
原理
其中φ为直线正切角,b为直线截距,ON为原点O到直线的垂11至直线的代数距离。由图示直线方程可由θ和ρ表示。
对于图(a):φ=π/2+θ b=ρ/sinΘ
整理后有
其余象限同理可得同样的结果。
故可知平面内一条直线可唯一计算出唯一的ρ和θ,即xoy平面内任意条直线对应参数空间(或称霍夫空间)θoρ中一点(ρ,θ)。
从另一个角度来说,过xoy平面内的一点(x1,y1)有无数条直线则对应霍夫空间的无数个点,这无数个点连起来即是θoρ平面内的曲线ρ=x1cosθ+y1sinθ。
由此易知判断xoy平面多点共线转换为在θoρ中曲线多线交点。
所以判断平面内哪些点为共线时,首先求出每一点对应到霍夫空间的曲线然后判断哪几条曲线相交于一点,最后将相交于一点的曲线反过来对应到xoy平面内的点。这些点就是共线的。
实践应用
在图像中解决的霍夫直线检测是针对二值图,验证那些事共线的。首先要根据验证的每一像素点的坐标,对应“画”出霍夫空间中的曲线,由于自变量θ∈[0,180)有无数个点,我们取间隔Δθ,一般以一度为间隔就够了。
那么如何利用计算出的θoρ空间中的点去验证哪些像素是共线的呢,此时需引入计数器即二维直方图。
其中我们很清楚的可以得出每个坐标所有的点数即同条线段所含有的点数。
基于此Opencv构建霍夫直线检测函数
lines = cv.HoughLines( image, rho, theta, threshold[, lines[, srn[, stn[, min_theta[, max_theta]]]]] )
image:输入的图像且为单通道二进制源图
lines:线的输出向量,每行由2或3个元素向量(ρ,θ)或(ρ,θ,votes)表示。ρ是距坐标原点(0,0)(图像的左上角)的距离。 θ是弧度的线旋转角(0〜垂直线,π/ 2〜水平线)。votes是计数器的计数。
rho:计数器的距离分辨率(以像素为单位)Δρ。
theta:计数器的角度分辨率(以弧度为单位)Δθ。
threshhold:计数器阈值参数。仅返回那些获得足够计数的线(> threshold)。
标准霍夫直线检测内存消耗较大,执行时间长,基于此,Matas,J.and Galambos,C. and Kittler,J.V… Robust Detection of Lines Using the Progres-sive Probabilistic Hough Transform. CVIU 78 1,pp 119-137 (2000)提出了概率霍夫直线检测,它随机地从边缘二值图中选择前景像素点,确定检测直线的两个参数,本质还是标准的霍夫直线检测。在opencv中为
lines = cv.HoughLinesP( image, rho, theta, threshold[, lines[, minLineLength[, maxLineGap]]] )
相同参数与标准霍夫直线参数相同其中
minLineLength:最小线长。短于此的线段将被拒绝。
maxLineGap:连接同一条线上的点之间的最大允许间隙。