介绍opencv中常见的霍夫变换

霍夫变换是非常有用的,在大型项目的设计中都有着非常厉害的作用(比如农机,在田里检测直线,寻迹等)
霍夫变换包括霍夫线变换和霍夫圆变换,在许多场合中需要快速的检测出直线或者圆其中一种非常有效的方法就是霍夫变换,霍夫变换就是在黑白图像中检测直线。
1.霍夫变换是图像处理中的一种特征提取的技术,霍夫变换拓展到任意形状物体的识别,多为圆和椭圆,霍夫变换运用两个坐标空间之间的变换将在一个空间中具有相同形状的曲线或者直线映射到另一个坐标空间的一个点上形成峰值,从而将检测任意形状的问题装换为统计峰值的问题,
2.霍夫曼线变换有三种,在霍夫曼线性变换之前首先要对图像进行边缘检测处理,既霍夫曼线变换的直接输入只能是边缘二值图像,霍夫变换分别是标准霍夫变换,多尺度霍夫变换,累计概率霍夫变换,在opencv中用HoughLines函数来调用标准霍夫变换和多尺度霍夫变换。
3.标准霍夫变换 HoughLines调用
4.多尺度霍夫变换 HoughLines调用
5.累计概率霍夫变换 HoughLinesP调用
检测到直线的时候从极坐标到直角坐标的变换
HoughLines函数可以找出采用霍夫变换的二值图像线条,C++:void HoughLines(InputArray image,OutputArray lines,double Rho,double,theta,int threshold,double srn=0,double stn=0)
1.第一个参数输入图像单通道二进制图像
2.检测到经过调用后存储了霍夫线变换输出的线条矢量,每一条线有由具有两个矢量表示,(r,theta),r表示离坐标原点的距图像的左上角坐标,theta表示弧度线条旋转角度{0-90}
3.double类型的rho,以像素为单位的精准距离,
4.double类型的theta,以弧度为角度为单位的角度精度,
5.int 类型的threshold累加平面的阈值参数既识别图像中某部分为图中的一条直线时它在累加平面中必须达到的值,大于阈值threshold的线段才可以被检测通过并返回到结果中。
6.对第三个参数精度的调整
7.double类型的stn,对于多尺度霍夫变换,srn表示第四个参数的进步尺寸的单位角度theta的除数距离,srn和stn同时为0表示使用经典的霍夫变换

二.累计概率霍夫变换
C++: void HoughLinesP(Inputrray image,OutputArrays lines,double rho,double theta,int threshold,double minLineLength=0,double maxLineGap=0)
1.image为原图像需要8位的单通道二进制图像。
2.lines经过调用HoughLinesP函数后存储了检测到的线条的输出矢量,每一条线由具有4个元素的矢量(x1,y1,x2,y2)来表示也就是两个二维点。
3.double类型的rho以像素为精度单位的距离精度。
4.double类型的theta,以弧度为单位的角度精度。另一种的表述方式是直线搜索
5.int类型的threshold,累加平面的阈值参数
6.表示最低线段长度
7.允许将同一行点与点之间连接起来的最大距离。

三.霍夫圆变换:
HoughCircle函数可以利用霍夫变换算法检测出灰度图中的圆,C++:void HoughCircles(I,O,int method,double dp,double minDist,double param1=100,double param2=200,int minRadius,int maxRadius)
1.输入图像,需要为8位单通道的灰度图像。
2.经过调用HoughCircles函数后此参数存储了检测到圆的输出矢量,每个矢量包括了3个元素的浮点矢量(x,y,radius)
3.所使用的检测方法目前就梯度法一种可以使用,HOUGH_GRADIENT
4.用来检测圆心的的累加器图像的分辨率于输入图像分辨率的倒数。
5.double类型的minDst,为霍夫变换检测到圆的圆心之间的最小距离,检测圆与圆
6.double类型的默认值100对应第三个参数中的数值
7.double对应第三个参数中的参数
8.表示圆半径的最小值
9.表示圆半径的最大值
此函数很容易检测出圆的圆心,
进行霍夫圆变换的过程:
vector circles;//这个圆是通过霍夫变换在二值或者灰度图片中提取出来的
HoughCircles(midImg,circles,HOUGH_GRADIEND,1.5,10,200,100,0,0);
for(size_t i=0;i<circles.size();i++)
{
Point center(cvRound(circles[i][0]),cvRound(circles[i][1]));
int radius=cvRound(cvRound(circles[i][2]));
//绘制圆心
circle(srcImg,center,3,Scalar(0,0,255),-1,8,0);
circle(srcImg,center,radius,Scalar(0,0,255),-1,8,0);

}
霍夫变换的过程:
1.在二值图像中提取圆或者直线
2.把圆和直线在原图上标记出来就可以的。

在改变阈值的同时,可以动态的控制霍夫线变换检测到线条的多少

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值