1

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) の構造テンソルになりましたね。

4

1 に答える 1

2

お考えのように、構造テンソルは 1 つのピクセルuで単純に計算されるのではなく、

ここに画像の説明を入力

しかし、

ここに画像の説明を入力

ここで、w( r )は、ピクセルの周囲を重み付けするために選択するウィンドウ関数です (ガウスなど)。

論理的に考えると、ピクセルの勾配だけでは、通常、そのピクセルの構造を表すのに十分な情報を含めることはできません。ピクセルの周囲を考慮する必要があります。したがって、影響半径rと影響範囲内のウィンドウ関数があります。rを変化させることで、見たい構造のスケールを選択できます。

すべてのピクセルで構造テンソルを計算したら、構造テンソルごとに大きさが最小の固有値に対応する固有ベクトルを計算することにより、構造テンソル フィールドを構成できます。

于 2013-09-11T09:48:17.830 に答える