Steger算法提取曲线中心线

找中心线在机器视觉上的应用可以说几乎没有,那我为什么要写这篇文章呢?主要原因是这种方法和文章《9点拟合梯度边缘亚像素方法 - 兜尼完 - 博客园 (cnblogs.com)》功能是相近的。都是根据一个整数像素点拟合一个亚像素值,都是求一个二元函数在某个方向上的极值点,但是方法却不一样。本文侧重理论上的推导。多年前我曾验证过这个算法,但是那些代码早就没了。原始论文链接:An Unbiased Detector of Curvilinear Structures (tum.de)。相关知识点参见:

已知条件是整数像素点${ \left( x_{0},y_{0} \right) }$。将图像看成一个二元函数${ f \left( x,y \right) }$,那么在这点附近可进行泰勒展开。为了突出海森矩阵${ \begin{pmatrix} f^{''}_{xx} \left( x_{0},y_{0} \right) & f^{''}_{xy} \left( x_{0},y_{0} \right) \\ f^{''}_{xy} \left( x_{0},y_{0} \right) & f^{''}_{yy} \left( x_{0},y_{0} \right) \end{pmatrix} }$,我们把它写成矩阵形式:

$${ f \left( x_{0}+\Delta x,y_{0}+\Delta y \right) \approx f \left( x_{0},y_{0} \right) + \begin{pmatrix} \Delta x & \Delta y \end{pmatrix} \begin{pmatrix} f^{'}_{x} \left( x_{0},y_{0} \right) \\ f^{'}_{y} \left( x_{0},y_{0} \right) \end{pmatrix}+\frac{1}{2} \begin{pmatrix} \Delta x & \Delta y \end{pmatrix} \begin{pmatrix} f^{''}_{xx} \left( x_{0},y_{0} \right) & f^{''}_{xy} \left( x_{0},y_{0} \right) \\ f^{''}_{xy} \left( x_{0},y_{0} \right) & f^{''}_{yy} \left( x_{0},y_{0} \right) \end{pmatrix} \begin{pmatrix} \Delta x \\ \Delta y \end{pmatrix} }$$

我们并不需要知道函数${ f \left( x,y \right) }$的具体形式。从上式可知只要知道它的一阶、二阶偏导数就可以对它进行处理。而图像的一阶、二阶偏导数确实可以通过卷积运算得到。接下来就是确定拟合亚像素的方向。论文是利用海森矩阵的特征值和特征向量取得这个方向的:海森矩阵较大的那个特征值对应的特征向量是函数数值变化率最大的方向;较小的那个特征值对应的特征向量是函数数值变化率最小的方向。因此这里使用的是上式中海森矩阵较大特征值对应的特征向量${ \left( e_{x},e_{y} \right) }$(可单位化此向量)。计算特征值、特征向量可以用OpenCV中的cv::eigen(...)函数。我们对上式加上方向限制,令${ \Delta x= te_{x},\Delta y=te_{y} }$,则有:

$${ f \left( x_{0}+te_{x},y_{0}+te_{y} \right) \approx f \left( x_{0},y_{0} \right) + \begin{pmatrix} te_{x} & te_{y} \end{pmatrix} \begin{pmatrix} f^{'}_{x} \left( x_{0},y_{0} \right) \\ f^{'}_{y} \left( x_{0},y_{0} \right) \end{pmatrix}+\frac{1}{2} \begin{pmatrix} te_{x} & te_{y} \end{pmatrix} \begin{pmatrix} f^{''}_{xx} \left( x_{0},y_{0} \right) & f^{''}_{xy} \left( x_{0},y_{0} \right) \\ f^{''}_{xy} \left( x_{0},y_{0} \right) & f^{''}_{yy} \left( x_{0},y_{0} \right) \end{pmatrix} \begin{pmatrix} te_{x} \\ te_{y} \end{pmatrix} }$$

可以看出来上式已经变成了一个关于t的一元函数。要计算它的极值只需要对t求导令其为0即可:

$${ f^{'} \left( x_{0}+te_{x},y_{0}+te_{y} \right) \approx e_{x} f^{'}_{x} \left( x_{0},y_{0} \right) + e_{y} f^{'}_{y} \left( x_{0},y_{0} \right) + t \left( e^{2}_{x} f^{''}_{xx} \left( x_{0},y_{0} \right) + 2e_{x}e_{y}f^{''}_{xy} \left( x_{0},y_{0} \right) + e^{2}_{y} f^{''}_{yy} \left( x_{0},y_{0} \right) \right)=0 }$$

即可解得:

$${ t=\frac{e_{x} f^{'}_{x} \left( x_{0},y_{0} \right) + e_{y} f^{'}_{y} \left( x_{0},y_{0} \right)}{e^{2}_{x} f^{''}_{xx} \left( x_{0},y_{0} \right) + 2e_{x}e_{y}f^{''}_{xy} \left( x_{0},y_{0} \right) + e^{2}_{y} f^{''}_{yy} \left( x_{0},y_{0} \right)} }$$

因此,亚像素值为:

$${ \left\{ \begin{matrix} x_{sub}=x_{0}+te_{x} \\ y_{sub}=y_{0}+te_{y} \end{matrix} \right. , 需要te_{x}\in \left[ 0.5,0.5 \right], te_{y}\in \left[ 0.5,0.5 \right] }$$

理论如上。可以看出来,利用海森矩阵求二元函数在某个方向上的极值点比用两曲面方程列方程组然后消元求解要方便一点。因它不需要区分特殊情况。

posted @ 2023-05-15 17:52  兜尼完  阅读(759)  评论(0编辑  收藏  举报