霍夫变换是一种特征检测(feature extraction),被广泛应用在图像分析(image analysis)、计算机视觉(computer vision)以及数位影像处理(digital image processing)。
霍夫变换是用来辨别找出物件中的特征,例如:线条。他的算法流程大致如下,给定一个物件、要辨别的形状的种类,算法会在参数空间(parameter space)中执行投票来决定物体的形状,而这是由累加空间(accumulator space)里的局部最大值(local maximum)来决定。
一、霍夫直线检测
-
在取得图像边缘的基础上,对一些特定的几何形状边缘,如直线、圆,通过图像霍夫变换把图像从平面坐标空间变换到霍夫空间坐标,就可以通过求取霍夫空间的局部极大值方法得到空间坐标对应参数方程中直线的两个参数,从而计算得到图像平面坐标中直线的数目与位置。
-
假设有直线如图5-3所示
图5-3
它在笛卡儿平面坐标系统中的斜率参数与截距参数为(k, b)。
若变换到极坐标空间则变成求取另外两个参数(r, θ),
二者之间的关系可以表示为:r=x cosθ+y sinθ -
对于每个平面空间的像素点坐标(x, y),随着角度θ的取值不同,都会得到r值,而对于任意一条直线来说,在极坐标空间它的(r, θ)都是固定不变的,所以对于每个平面空间坐标点绘制极坐标的曲线如图5-4所示。
图5-4
由在平面空间同属于一条直线的像素点绘制出来的曲线必然会相交于一点(如图5-4b所示的曲线),而这个点正是直线在极坐标空间中的参数方程的参数,这样就在极坐标空间找到了直线的参数方程,反变换回到平面坐标空间就可以求得直线的两个参数(k, b),得到直线位置,而它们在极坐标的交点就是直线在霍夫空间的表达,直线越长,其在霍夫空间这个点的累积值就越高,相对的灰度值也就越(亮)。
总结一下:转换直角坐标系中每个点到极坐标-->求出极坐标中的交点-->把交点极坐标转换为直角坐标系的直线方程
二、函数Cv2.HoughLines
OpenCV关于霍夫直线变换提供了两个相关API函数,
- 一个是在霍夫空间求取直线两个极坐标的参数,需要开发者自己转换到平面坐标空间计算直线,
- 另外一个则会直接返回平面空间直线/线段的两个点坐标信息。
HoughLines(Mat image,Mat lines,double rho,double theta,int threshold)
- image:表示输入图像,8位单通道图像,一般为二值图像。
- lines:表示输出的每个直线的极坐标参数方程的两个参数。
- rho:表示极坐标空间r值每次的步长,一般设置为1。
- theta:表示角度θ,每次移动1°即可。
- threshold:表示极坐标中该点的累积数,该累积数越大,则得到的直线可能就越长,取值范围通常为30~50,单位是像素,假设为30的话,则表示大于30个像素长度的线段才会被检测到。
Cv2.HoughLinesP(Mat image,Mat lines,double rho,double theta,int threshold,double minLineLength, double maxLineGap)
- minLineLength:表示可以检测的最小线段长度,根据实际需要进行设置。
- maxLineGap:表示线段之间的最大间隔像素,假设5表示小于5个像素的两个相邻线段可以连接起来。
网友评论