目录
介绍
用Hough检测圆
圆的Hough变换
介绍
画好直线之后,记住,线是参数模型最简单的形式,现在我们来看看更复杂的东西,也就是圆。
这是圆的方程,其中 a 和 b 是中心,r 是半径:
现在我们假设半径已知。我们只需要找到这些点的位置。
这里有一个圆,在这个圆上有三个点,这里的蓝点:
那么,霍夫空间是什么呢?
因为通常有三个未知数,a b r,但是我告诉过你们半径,霍夫空间就是 a 和 b :
对,中心位置 x 和 y 方向。现在我们考虑第一点,比如说,x0 y0,这一点就在下面图片那里:
所以这个点必须在圆上,我们知道它的半径 r。
一种思考方法是:圆的半径是这个点的半径 r,它的作用是为一组点投票,这就是这条绿线所代表的。
这一组点在ab空间的这个位置附近,对吧?
对于图像空间中的一个点,我们在霍夫空间中得到半径为r的圆:
让我们进入下一点:
是一样的,所以它的半径是r。
在霍夫空间中,我们会沿着这个圈投票:
下一点:
如果图像中的每个点都投了一个圈,我们就会得到所有的选票:
就像之前一样,我们在这里得到了大多数的选票这对应于中间点,这就是画在这里的点:
所以它的作用就像之前我们选直线一样,只是现在我们不用正弦曲线,而是在一个ab Hough的空间里画一个圆。
用Hough检测圆
事实上,这里有一个很好的运行例子:
这是一张非常古老的照片,但是你可以在这里看到,有一个保龄球,这是画十字的地方:
就像。。。给你们展示一些其他方法来找到这个移动的球,你可以想象寻找移动的东西。
毕竟,它还没有击中要害。但是当你寻找移动的物体时,他们会找到这个边界框。
我们怎么能找到比球更多的东西呢?
实际上,如果你仔细看,你会发现这条小巷很亮:
Okay,事实上,过一会儿我们会讨论反射函数和镜面反射函数,你们会讨论为什么在这条球道上你会看到球的图像。
因为这个,这里也有运动,所以你得到了这个边界框(如图)。但没关系,我们说的基本上就是它能找到那个圆。
这是另一个例子:
实际上,如果你输入Hough变换圆或者类似的东西到谷歌,在谷歌中,你寻找图像,你会得到这个图像。
这张照片是由Vivek Kwatra拍摄的,当时他还是个研究生,我班上的助教,大概是在1811年。
我们所做的就是把这些硬币放在有纹理的背景上然后拍张照片。
他这么做是因为他不得不这么做,因为他是我的助教。他现在是一个非常有名的人在做很酷的研究工作。
基本上,你可以用这个来计算边缘,这是它的边缘图像(如图),然后我们可以寻找圆。
现在,我们要用已知的半径方法。假设我们从一便士的半径开始。你可能会看到硬币中间有一个很好的亮点:
现在你可能还会注意到,有一些区域是膨胀的:
这里就没那么多了:
那是因为你可以在硬币的圆里面再装一个圆,
绕着圆的边缘,中心绕着圆的中间旋转:
这就是这个小圆的中心:
但在真正的硬币上,它们会对齐,所以你会得到一个更亮的点:
那么我们如何找到25美分硬币呢?
我们用一个更大的半径,我们再次投票,你会看到这些点在这里,这里,这里:
现在这个便士的边缘(如图),他们再次投票给这个圆,但不像25美分硬币那样结实。
这是原始的图像:
这些是组合探测:
这很酷,你知道,你可以找到圆圈。
圆的Hough变换
假设你真的不知道半径。
那么我们该怎么办呢? 让我们一起来思考这个问题。
现在我们的霍夫空间有三个维度,a b r(如图),因为我们不知道半径是多少。
如果我有一个点(如图),会发生什么?
现在,如果我们假设这个点的半径是7,那么它会是一个围绕这个点的圆,就像我们之前做的那样。
如果半径是3,它会是另一个围绕同一个点的圆,但会小一些:
所以,我希望你们能开始看到我们在这里得到的实际上是一个圆锥。
所以,在未知半径的情况下,每个点在这个三维空间里都为一个完整的圆锥进行投票。
这就是这个圆锥的外观, 不是一个填充的圆锥,而是一个曲面。
我们继续取圆的下一点,看它的作用是什么?
它会投票给另一个锥体,你可以把这些加起来:
现在我要告诉你们这是很痛苦的一件事情。
事实上,如果你们中有人做了一个类似于这个的随机课程的习题集,我们会告诉你们关于寻找圆的问题。
如果你试着在一个巨大的3D空间里投票,它不会工作得很好。
在后面的很多文章中,我们会讲到ransack,它会克服这个维度。
但现在,只要知道我们有一个小问题,那就是不断增大的投票空间。
虽然这个问题是可以解决的,但处理的过程有点痛苦。
还记得我们去掉投票数的方法之一就是使用梯度方向吗?
因为如果我已有一个点 和 我已经知道了该点的梯度,而它可能只有一条可能的线。
我们可以对圆做同样的事情。
现在我们有一个未知的半径,但是我们有一个梯度,我们的霍夫空间是a b r:
但这一次,这里的一个点会有对应的梯度:
现在,如果我们知道半径,我们就会得到一个可能的圆。
所以,如果现在你告诉我这是一个点(如图),这是我知道半径的梯度,那就是中心唯一的位置。
但是如果半径是它的一半,那么圆心就在这里:
或者中心,我猜它也可能在另一边:
所以,只有当你有梯度的时候,这样的单条线路的投票才会发生:
所以在霍夫空间中,即使它是一个三维的霍夫空间,你只会沿着一条线投票:
这样稍微好一点,至少让投票更容易。
当你有这个三维的霍夫空间时,你仍然有这个问题。
——学会编写自己的代码,才能练出真功夫。