图像处理之霍夫变换(Hough Transform)

3 篇文章 0 订阅
1 篇文章 0 订阅

霍夫变换,就是一个可以让机器自己学会找直线的算法。

  1. 基本原理

一条直线可由两个点A=(X1,Y1)和B=(X2,Y2)确定(笛卡尔坐标)

公式:y=kx+q

也可以写成关于(k,q)的函数表达式(霍夫空间):

对应的变换可以通过图形直观表示:

变换后的空间成为霍夫空间。即:笛卡尔坐标系中一条直线,对应霍夫空间的一个点。

反过来同样成立(霍夫空间的一条直线,对应笛卡尔坐标系的一个点):

再来看看A、B两个点,对应霍夫空间的情形:

三个点共线的情况:

可以看出如果笛卡尔坐标系的点共线,这些点在霍夫空间对应的直线交于一点:这也是必然,共线只有一种取值可能。

如果不止一条直线呢?再看看多个点的情况(有两条直线):

其实(3,2)与(4,1)也可以组成直线,只不过它有两个点确定,而图中A、B两点是由三条直线汇成,这也是霍夫变换的后处理的基本方式:选择由尽可能多直线汇成的点。

霍夫空间:选择由三条交汇直线确定的点(中间图),对应的笛卡尔坐标系的直线(右图):

到这里问题似乎解决了,已经完成了霍夫变换的求解,但是如果像下图这种情况呢?

k=∞是不方便表示的,而且q怎么取值呢,这样不是办法。因此考虑将笛卡尔坐标系换为:极坐标表示。

在极坐标系下,其实是一样的:极坐标的点→霍夫空间的直线,只不过霍夫空间不再是[k,q]的参数,而是[ρ,θ]的参数,给出对比图:

霍夫变换的算法步骤:

编程思路

1.  读取一幅待处理二值图像,最好背景为黑色;

2.  取得源像素数据;

3.  根据直线的霍夫变换公式完成霍夫变换,预览霍夫空间结果;

4.  寻找最大霍夫值,设置阈值,反变换到图像RGB值空间(程序难点之一);

5.  越界处理,显示霍夫变换处理以后的图像;

Opencv-python code解释:

1.检测线

cv2.HoughLines(image, rho, theta, threshold[, lines[, srn[, stn]]])

image是输入的图像

rho是以像素为单位的累加器的距离分辨率

theta是在弧度内的蓄能器的角度分辨率

threshold其实是阈值,当累加器超过一定的范围才看作是直线

 

cv2.HoughLinesP(image, rho, theta, threshold[, lines[, minLineLength[, maxLineGap]]])

其他的参数和上一个函数一样

minLineLength是线的最短长度(比这个短的都忽略了)

maxLinegap两条直线的最大间隔,小于这个间隔的看成一条直线。

下面左图为原始图像,右图为HoughLines和HoughLinesP后的图像,从图中可以看到检测到草丛中间的一条小路:

 

2.检测圈

cv2.HoughCircles(image, method, dp, minDist[, circles[, param1[, param2[, minRadius[, maxRadius]]]]])

image是输入图象

method仅有一个cv2.HOUGH_GRADIENT

dp累加器分辨率与图像分辨率的反比。例如,如果dp=1,累加器与输入图像具有相同的分辨率。如果dp=2,则累加器的宽度和高度为原来的一半。

minDist检测圆的中心之间的最小距离。如果参数太小,可能会错误地检测到多个相邻的圆。如果太大,可能会漏掉一些圆。

param1第一个method-specific参数。在CV_HOUGH_GRADIENT的情况下,它是两个传递到Canny()边缘检测器的更高阈值(下一个是两倍小)。

param2第二个method-specific参数。在CV_HOUGH_GRADIENT的情况下,它是检测阶段圆形中心的累加器阈值。它越小,就会发现更多的假圆。圆形,对应于较大的累加器值,将首先返回。

minradius圆的最小半径

maxradius圆的最大半径

下面左图为原始图像,右图为HoughLines和HoughLinesP后的图像,从图中可以看到检测到了蒙古包:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值