霍夫变换标准霍夫变换1.C++: void HoughLines(InputArray image, OutputArray lines, double rho, doubletheta, int threshold, double srn=0, double stn=0 )第一个参数,InputArray类型的image,输入图像,即源图像,需为8位的单通道二进制图像,可以将任意的源图载入进来后由函数修改成此格式后,再填在这里。
第二个参数,InputArray类型的lines,经过调用HoughLines函数后储存了霍夫线变换检测到线条的输出矢量。
每一条线由具有两个元素的矢量表示,其中,是离坐标原点((0,0)(也就是图像的左上角)的距离。
是弧度线条旋转角度(0~垂直线,π/2~水平线)。
第三个参数,double类型的rho,以像素为单位的距离精度。
另一种形容方式是直线搜索时的进步尺寸的单位半径。
PS:Latex中/rho就表示。
第四个参数,double类型的theta,以弧度为单位的角度精度。
另一种形容方式是直线搜索时的进步尺寸的单位角度。
第五个参数,int类型的threshold,累加平面的阈值参数,即识别某部分为图中的一条直线时它在累加平面中必须达到的值。
大于阈值threshold的线段才可以被检测通过并返回到结果中。
第六个参数,double类型的srn,有默认值0。
对于多尺度的霍夫变换,这是第三个参数进步尺寸rho的除数距离。
粗略的累加器进步尺寸直接是第三个参数rho,而精确的累加器进步尺寸为rho/srn。
第七个参数,double类型的stn,有默认值0,对于多尺度霍夫变换,srn表示第四个参数进步尺寸的单位角度theta的除数距离。
且如果srn和stn同时为0,就表示使用经典的霍夫变换。
否则,这两个参数应该都为正数。
累计概率霍夫变换1.C++: void HoughLinesP(InputArray image, OutputArray lines, double rho, double theta, int threshold, double minLineLength=0, double maxLineGap=0 )第一个参数,InputArray类型的image,输入图像,即源图像,需为8位的单通道二进制图像,可以将任意的源图载入进来后由函数修改成此格式后,再填在这里。
第二个参数,InputArray类型的lines,经过调用HoughLinesP函数后后存储了检测到的线条的输出矢量,每一条线由具有四个元素的矢量(x_1,y_1, x_2, y_2)表示,其中,(x_1, y_1)和(x_2, y_2) 是是每个检测到的线段的结束点。
第三个参数,double类型的rho,以像素为单位的距离精度。
另一种形容方式是直线搜索时的进步尺寸的单位半径。
第四个参数,double类型的theta,以弧度为单位的角度精度。
另一种形容方式是直线搜索时的进步尺寸的单位角度。
第五个参数,int类型的threshold,累加平面的阈值参数,即识别某部分为图中的一条直线时它在累加平面中必须达到的值。
大于阈值threshold的线段才可以被检测通过并返回到结果中。
第六个参数,double类型的minLineLength,有默认值0,表示最低线段的长度,比这个设定参数短的线段就不能被显现出来。
第七个参数,double类型的maxLineGap,有默认值0,允许将同一行点与点之间连接起来的最大的距离。
霍夫圆变换1.C++: void HoughCircles(InputArray image,OutputArray circles, int method, double dp, double minDist, double param1=100,double param2=100, int minRadius=0, int maxRadius=0 )第一个参数,InputArray类型的image,输入图像,即源图像,需为8位的灰度单通道图像。
第二个参数,InputArray类型的circles,经过调用HoughCircles函数后此参数存储了检测到的圆的输出矢量,每个矢量由包含了3个元素的浮点矢量(x, y, radius)表示。
第三个参数,int类型的method,即使用的检测方法,目前OpenCV中就霍夫梯度法一种可以使用,它的标识符为CV_HOUGH_GRADIENT,在此参数处填这个标识符即可。
第四个参数,double类型的dp,用来检测圆心的累加器图像的分辨率于输入图像之比的倒数,且此参数允许创建一个比输入图像分辨率低的累加器。
上述文字不好理解的话,来看例子吧。
例如,如果dp= 1时,累加器和输入图像具有相同的分辨率。
如果dp=2,累加器便有输入图像一半那么大的宽度和高度。
第五个参数,double类型的minDist,为霍夫变换检测到的圆的圆心之间的最小距离,即让我们的算法能明显区分的两个不同圆之间的最小距离。
这个参数如果太小的话,多个相邻的圆可能被错误地检测成了一个重合的圆。
反之,这个参数设置太大的话,某些圆就不能被检测出来了。
第六个参数,double类型的param1,有默认值100。
它是第三个参数method设置的检测方法的对应的参数。
对当前唯一的方法霍夫梯度法CV_HOUGH_GRADIENT,它表示传递给canny边缘检测算子的高阈值,而低阈值为高阈值的一半。
第七个参数,double类型的param2,也有默认值100。
它是第三个参数method 设置的检测方法的对应的参数。
对当前唯一的方法霍夫梯度法CV_HOUGH_GRADIENT,它表示在检测阶段圆心的累加器阈值。
它越小的话,就可以检测到更多根本不存在的圆,而它越大的话,能通过检测的圆就更加接近完美的圆形了。
第八个参数,int类型的minRadius,有默认值0,表示圆半径的最小值。
第九个参数,int类型的maxRadius,也有默认值0,表示圆半径的最大值。
椭圆检测由椭圆的公式可得,确定一个椭圆需要5个参数,a,b 为椭圆的长轴和段轴,P,Q 为椭圆中心坐标,θ为椭圆的旋转角度。
如果用传统的Hough变换方法,参数空间需要五维。
这种方法在计算过程中所耗费的时间和空间资源是惊人的,根本无法应用于实际。
为此,人们提出了很多新的改进算法。
改进算法主要分为两种:1)随机Hough变换(RHT),采用多到一的映射,但是随机采样会带来大量无效的计算,当点数很大时,算法的性能急剧下降。
2)利用椭圆的几何特征降低参数的维度。
椭圆中心(P,Q)是平面上所有点中,距离椭圆轮廓上点最大距离最小的点。
计算图像中每一点与椭圆(椭圆边界)最远的距离L,其中,L最小的点就是椭圆的中心,L就是椭圆的短轴a 。
算法描述:1)首先对图像进行边缘检测,得到二值化的边缘轮廓图,将边缘图上的点坐标存入数组A。
2)对图像上的每一点,计算与上一步所得数组A 中点的距离,得到每一点距数组A 中点的最大距离,所有点中最大距离最小的点,即是椭圆中心(p, q),该最大距离即是椭圆长轴长度a。
3)将数组A中每一点的数值和刚才得到的3个椭圆参数p、q、a 代入椭圆方程(1)。
4)在二维参数空间上对参数b、θ 进行统计,得到峰值超过一定阈值的一组参数即为椭圆。
凸包在一个实数向量空间V中,对于给定集合X,所有包含X的凸集的交集S被称为X的凸包。
算法:增量式算法:逐次将点加入,然后检查之前的点是否在新的凸包上。
由于每次都要检查所有之前的点,时间复杂度为O(n^2)。
包裹法(Jarvis步进法):首先由一点必定在凸包的点开始,例如最左的一点A1。
然后选择A2点使得所有点都在A1A2的右方,这步骤的时间复杂度是O(n),要比较所有点以A1为原点的极坐标角度。
以A2为原点,重复这个步骤,依次找到A3,A4…A k,A1。
这总共有k步。
因此,时间复杂度为O(kn)。
葛立恒(Graham)扫描法: 由最底的一点A_1开始(如果有多个这样的点,那么选择最左边的),计算它跟其他各点的连线和x轴正向的角度,按小至大将这些点排序,称它们的对应点为A1,A2,A3…An。
这里的时间复杂度可达O(nlog n)。
考虑最小的角度对应的点A3。
若由A2到A3的路径相对A1到A2的路径是向右转的(可以想象一个人沿A1走到A2,他站在A2时,是向哪边改变方向),表示A3不可能是凸包上的一点,考虑下一点由A2到A4的路径;否则就考虑A3到A4的路径是否向右转……直到回到A1。
这个算法的整体时间复杂度是O(nlog {n}),注意每点只会被考虑一次,而不像Jarvis步进法中会考虑多次。
这个算法由葛立恒在1972年发明。
它的缺点是不能推广到二维以上的情况。
单调链: 将点按x坐标的值排列,再按y坐标的值排列。
选择x坐标为最小值的点,在这些点中找出y坐标的值最大和y坐标的值最小的点。
对于x坐标为最大值也是这样处理。
将两组点中y坐标值较小的点连起。
在这条线段下的点,找出它们之中y坐标值最大的点,又在它们之间找x坐标值再最小和最大的点……如此类推。
时间复杂度是O(nlog {n})。