1

ラドン変換アルゴリズムを実装するacプログラムを作成しようとしています。画像f(x、y)の場合、g(phi、s)のコレクションであり、すべてのphiは画像のランドン変換であり、g(phi、s)は次のように定義されます。

ここに画像の説明を入力してください

現在、私はCの経験があまりなく、複雑な数学演算を実行するために常にJavaとC#を備えた外部ライブラリを使用していました。cの関数を見つけるのに苦労しています。また、それを実行する関数を作成するのにも苦労しています。数値積分を調べていますが、それは定積分の場合です。どんな助けでもいただければ幸いです

4

3 に答える 3

1

一般に、場合によっては非常に複雑で、テストして強調する必要があるこの種の問題については、手書きのコードに依存しないでください。C Gnu Scientific Library でプログラムする場合は、積分計算に役立ちます。

于 2012-03-23T07:54:07.480 に答える
1

免責事項: 画像処理コミュニティに知られているラドン変換の特殊な実装が存在する場合があります。私はそれらについては知りません。私はこの問題を統合の問題として扱っているだけです。なるほど。http://takinginitiative.net/2008/04/02/radon-transform-c-implementation-update/画像のラドン変換を計算する特定の方法があるかもしれないこと。

ここで実際に行っているのは、直線に沿った 1D 積分です。ウィキペディアの記事http://en.wikipedia.org/wiki/Radon_transformの 4 番目の式を参照してください。

画像に対してこれを行う場合、積分の計算に使用する方法は、選択した補間に大きく依存します。双一次補間を使用する場合は、単純な (適応的な) 台形規則で良い結果が得られる可能性があります。

C ライブラリが役立つ場合は、GNU Scientific Libraryを参照してください。

于 2012-03-23T08:06:16.423 に答える
0

計算g(phi,s)するには、少なくとも最も基本的な合計を試すことができます。

まず、いくつかの小さなステップを使用してf(x,y) * delta(x*sin(phi) - y*cos(phi) - s) * dx、特定の画像yとすべての画像を合計します。のループです。次に、いくつかの小さなステップを使用して、すべての画像に対して上記を繰り返します。これは の別のループです。ああ、 を掛けることを忘れないでください。したがって、 forとand 内に合計2 つの入れ子になったループがあります。たとえば、次のようになります。xdxxydyydyyxf(x,y) * delta(x*sin(phi) - y*cos(phi) - s) * dx * dy

#include <math.h>
#include <assert.h>

double g(double phi, double s, double xmin, double xmax, double dx, double ymin, double ymax, double dy)
{
  double x, y, sum;

  assert(xmin <= xmax && dx > 0);
  assert(ymin <= ymax && dy > 0);

  sum = 0;

  for (y = ymin; y <= ymax; y += dy)
    for (x = xmin; x <= xmax; x += dx)
      sum += f(x,y) * delta(x*sin(phi) - y*cos(phi) - s) * dx * dy;

  return sum;
}

f()画像データを返すように定義し、delta()適切なdxand dy(大きすぎず、小さすぎず) を選択するだけです。これにより、最初の結果が得られるはずです。

于 2012-03-23T07:54:30.643 に答える