6

Log カーネルの実装に問題があります。このリンクhttp://homepages.inf.ed.ac.uk/rbf/HIPR2/log.htmに示されているように、theta = 1.4 で 9x9 カーネルを実装しようとしています。

ただし、式自体に問題があります。誰かが中心の計算方法、つまり 9x9 カーネルで -40 を取得するために使用する x と y の値を教えてくれれば、非常にありがたいです。

4

2 に答える 2

1

最近、私はLoGフィルターを実装しました。必要なのは、パラメーターとしての数式とシグマだけです。固定サイズのマスクが必要な場合は、フィルターマスク値をマトリックスに保存して使用するか、毎回再計算して必要なマトリックスを作成できます。フィルタのサイズは、そのサイズを超えるサイズが使用されている場合、シグマ値によって異なります。最大サイズを超えている残りの部分は、その式を使用してゼロに計算されるため、意味がありません。したがって、たとえば、フィルターサイズ= 9X9を取得します。次に、フィルター自体を行列として計算するには、次の値を使用して数式を実行する必要があります。

int halfsize = size / 2;    
for (int x = -halfsize; x < halfsize; ++x)
   for (int y = -halfsize; y < halfsize; ++y)
       mask[x][y] = LoGFunction(x, y);

そんな感じ。また、フィルターサイズは奇数値でなければならないことも意味します。お役に立てれば。あなたの場合、サイズ=9シグマ=1.4 xおよびyは-4から4に変化します。ポイント(0、0)(フィルターの中心)で数式を使用すると、-12に近い値が得られます。

しかし、シグマを0.2986にすると、-40に近い必要な答えが得られます。また、シグマ値が1.4に等しいと書かれている理由もわかりません。5月ba何かが足りません。間違えた場合は訂正してください。

于 2010-04-02T13:53:16.830 に答える
1

数式について心配する必要はありません。これは係数を生成するために使用されるだけです。これらの 9x9 係数を画像に適用するだけです。

例 (テストされていないコード!):

const int K = 9;
const int K2 = K / 2;
const int NORM = 500; // constant for normalising filter gain
const int coeffs[K][K] = { ... };
int in_image[M][N];
int out_image[M][N];

for (i = K2; i < M - K2; ++i)
{
    for (j = K2; j < N - K2; ++j)
    {
        int term = 0;
        for (di = -K2; di <= K2; ++di)
        {
            for (dj = -K2; dj <= K2; ++dj)
            {
                term += in_image[i + di][j + dj] * coeff[K2 + ii][K2 + jj];
            }
        }
        out_image = term / NORM;
    }
}
于 2010-04-01T06:45:47.227 に答える