1.前言
进入opencv算法学习。算法学习分2个步骤,一个是算法推导及理解。另外一部分是看opencv算法源码。
今天进行的是kitchen-Rosenfeld角点检测算法理论。
2.理解算法
网上先搜索了下,kitchen和Rosenfeld提出的基于局部梯度幅度值和边界上梯度方向改变率的角点检测算法。因为他利用了边缘曲线曲率和梯度幅度值都很大的特点。响应函数C为曲率k和梯度幅度值g的乘积。公式为
C的极值对应的像素即为角点。
其中
这个公式是如何推导的?下载了Kitchen 1982年的论文 Gray-level corner detection,没有全看,主要是看公式推导,想看看他的具体推导步骤。结果由于我不记得二元函数链式法则,折腾了老半天。另外,梯度在某个方向上的投影就是方向导数,论文中的我一开始理解错了,因为看到论文中写了投影,以为是方向导数的方向,其实是梯度的方向。
3.论文算法推导
论文算法相关的截图如下:
是梯度对x轴的旋转角度。代表梯度对于x方向的偏导数。然后又对求x和y方向的偏导数,就是求梯度方向的变化率,其实可以理解为曲率,具体曲率公式如下图:
曲率公式.png
但是作者这部分论文中公式的描述还没有说到曲率,对x的偏导数和对y的偏导数。之后会利用二元函数链式除法求导法则来推导的,至少我目前是这样理解的。
,而g_x本来就是对x的导数,再次对x求偏导数,就是二阶导数,若是对x求偏导数就是继续看是通过什么公式变成的呢?
,我在网上曲率公式里搜索到的。
那么论文中的
然后对求偏导,前面的乘数我把他看做常数。按照链式法则求导就是:
,和前面的乘数进行约分,最后梯度方向是对x的偏导数为,同理可以计算梯度方向对y的偏导数。结果和论文中一致。
最后论文中用了梯度在沿边缘线的方向(梯度-90的方向)的投影来计算,即通过内积公式,cos但是里面的K有除数,我觉得不应该有的。
然后通过点乘公式
,将之前的和带入后,得出和最初网上搜索到的kitchen公式一致。
4.遇到的问题
1.点g(x,y)关于x和y是二元函数,所以是一个三维曲面。怎么和灰度联系呢?
答:图像输入数据可以看做是离散的像素点集合,可以从曲面的角度来任务它是一个以像素灰度值为Z方向值的曲面。
2.后来突然来了个问题,图像梯度怎么求呀,只有输入图像数据,公式是什么呢?
答:后来看了sobel算子就是离散函数的梯度表达式,soble算子和图像数据进行计算就可以求梯度了。这个将来再具体分析。
3.(gx,gy)的方向是梯度方向,是穿过边缘的,(-gy,gx)是边缘的方向该怎么理解呢?
答:从公式计算来理解,他的目的其实是想用cos0=1,否则x和y方向垂直,内积需要乘以cos90=0。(gx,gy)为90度,那么像左转90度(即减去90度)则为0度了。
看看cos图像。
cos图像.png
从含义来理解,梯度是标量场增加最快的方向。从地理学等高线来理解。梯度方向上经过很多等高线(边缘),而沿边缘方向(即沿着等高线方向)就是和梯度垂直的方向。
- 关于偏导数等于吗?
答:是的。
网友评论