如何计算2D阵列的结构张量(即结构张量场)?
我无法弄清楚我在实施中做错了什么。在我的例子中,2D数组是2D灰度图像,这里是我使用C ++和Eigen做的一般概述:
// the 2D grey-scale image, represented by a 2D array of doubles
ArrayXXd img;
// compute the gradient vector field, which produces a 2D array of 2D vectors
typedef Array<Vector2d, Dynamic, Dynamic> ArrayXXv2;
ArrayXXv2 g = gvf(img);
// compute the outer-product of each element in g to get a 2x2 matrix, e.g.,
Matrix<double, 2, 2> st00 = g(0,0) * g(0,0).transpose();
st00现在是img(0,0)的结构张量,是不是这样呢?
答案 0 :(得分:2)
你似乎认为,结构张量不是简单地在一个像素 u 上计算的,
但是,
其中 w( r )是一个窗口函数,您可以选择使用(例如高斯)来衡量像素的周围环境。
如果从逻辑上考虑它,单独一个像素的梯度通常不能包含足够的信息来表示该像素的结构。您需要考虑像素的周围环境。因此,我们有一个影响半径 r ,以及影响区域的窗口函数。通过改变 r ,您可以选择要查看的结构的比例。
一旦计算了每个像素的结构张量,就可以通过计算与每个结构张量的最小幅度的特征值对应的特征向量来组成结构张量场。