算法原理
对于一个像素P,它的亮度值设为IP。
设定一个合适的阈值t。
考虑以该像素点为中心的一个半径等于3像素的离散化的Bresenham圆,这个圆的边界上有16个像素(如下图所示)。
现在,如果在这个大小为16个像素的圆上有n个连续的像素点,它们的像素值要么都比IP+t大,要么都比IP−t小,那么它就是一个角点。n的值可以设置为12或者9,实验证明选择9可能会有更好的效果。
上面的算法中,对于图像中的每一个点,我们都要去遍历其邻域圆上的16个点的像素,效率较低。我们下面提出了一种高效的测试(high-speed test)来快速排除一大部分非角点的像素。该方法仅仅检查在位置1,9,5和13四个位置的像素,首先检测位置1和位置9,如果它们都比阈值暗或比阈值亮,再检测位置5和位置13。如果P是一个角点,那么上述四个像素点中至少有3个应该必须都大于IP+t或者小于IP−t,因为若是一个角点,超过四分之三圆的部分应该满足判断条件。如果不满足,那么pp不可能是一个角点。对于所有点做上面这一部分初步的检测后,符合条件的将成为候选的角点,我们再对候选的角点,做完整的测试,即检测圆上的所有点。
Matlab代码
|
|