C ++またはMATLABでのテクニカルペーパーアルゴリズムの実装


14

私は電気工学の学部生です。信号および画像処理アルゴリズム(再構成、セグメンテーション、フィルタリングなど)に関する多くの技術論文を読んでいます。これらの論文に示されているアルゴリズムのほとんどは、連続時間と連続周波数にわたって定義されており、多くの場合、複雑な方程式の観点から解を提供します。上記の論文で得られた結果を複製するために、C ++またはMATLABでゼロから技術論文をどのように実装しますか?

より具体的には、Wang et al(IEEE Trans Med Imaging。1993; 12(3):486-96)の論文「A general cone-beam rebuild algorithm」を見て、どうすれば始めることができるのか疑問に思っていました。アルゴリズムを実装していますか?式10は、再構築された画像の式を示します。どのようにコーディングしますか?各ボクセルを通過し、対応する式を計算するforループがありますか?その式で関数の関数をどのようにコーディングしますか?任意のポイントで関数をどのように評価しますか?

ゴンザレスとウッズの本「デジタル画像処理」を読みましたが、まだ迷っています。また、数値レシピの本シリーズについても読んでいます。それは正しい方法でしょうか?

研究論文からアルゴリズムをプログラミングした経験は何ですか?ヒントや提案はありますか?


1
機会があれば、この論文を見ていきます。しかし、これはすべて、与えられたグラフィックのXYZポイントに関するものだと思います。頂点を定義して、そこから作業します。

2
通常、サンプリングによって信号を離散化し、積分を合計に変換します。
-nibot

したがって、サンプリングと積分の合計への変換について読みましたが、被積分関数の関数が行列として保存されている場合、各サンプリングポイントで被積分関数をどのように評価しますか?

1
ダミアン、ラドン変換が逆投影によってどのように反転するのか見ましたか?これは少し簡単な例で、興味がある場合は説明できます。これは、投稿した論文で説明されている円錐サンプリングではなく、平面波を使用したトモグラフィーに使用されます。 en.wikipedia.org/wiki/Radon_transform
nibot

1
@ mr-crt、代わりにdsp.SEに移行できますか?
-nibot

回答:


15

連続時間/空間/周波数で定義される信号処理アルゴリズムは、通常、離散グリッドで信号をサンプリングし、積分を合計に変換します(微分を差分に変換します)。空間フィルターは、畳み込みカーネルによる畳み込み(つまり、近傍の加重和)によって実装されます。

サンプリングされた時間領域信号のフィルタリングに関する膨大な知識があります。時間領域フィルターは、いずれかの有限インパルス応答フィルターとして実装されます。現在の出力サンプルは、前のN個の入力サンプルの加重和として計算されます。または無限インパルス応答フィルター。現在の出力は、前の入力と前の出力の加重和です。正式には、離散時間フィルターは、ラプラス変換の離散時間アナログであるz変換を使用して記述されます。双一次変換マップに他の(1つとMatlabの中に)。c2dd2c

任意のポイントで関数をどのように評価しますか?

サンプリンググリッド上に直接存在しないポイントで信号の値が必要な場合、近くのポイントからその値を補間します。補間は、最も近いサンプルの選択、最も近いサンプルの加重平均の計算、または任意の複雑な分析関数をサンプリングされたデータに当てはめ、必要な座標でこの関数を評価するだけの簡単なものです。均一でより細かいグリッドへの補間はアップサンプリングです。元の(連続)信号にサンプリンググリッドの半分よりも細かい詳細(周波数)が含まれていない場合、連続関数はサンプルバージョン(ナイキストシャノンサンプリング定理)から完全に再構築できます。2Dで補間する方法の例については、バイリニア補間

Matlabでは、interp1またはinterp2を使用して、1Dまたは定期的にサンプリングされた2Dデータを(それぞれ)griddata補間したり、不規則にサンプリングされた2Dデータから補間したりできます。

各ボクセルを通過し、対応する式を計算するforループがありますか?

はい、正確に。

Matlabは、行列とベクトル(多次元配列)を操作するように設計されているため、明示的なforループを介してこれを行う必要がなくなります。Matlabでは、これは「ベクトル化」と呼ばれます。定積分はで近似することができsumcumsumtrapzcumtrapz、など

ゴンザレスとウッズの本「デジタル画像処理」を読みましたが、まだ迷っています。また、数値レシピの本シリーズについても読んでいます。それは正しい方法でしょうか?

はい、数値レシピは素晴らしい出発点です。これは非常に実用的であり、最終的に必要になる数値的手法のほとんどをカバーしています。(Matlabは必要なものをすべて既に実装していることがわかりますが、 数値レシピは優れた背景を提供します。)

「アルゴリズムとデータ構造」のクラスを受講しましたが、そこに提示されている資料と科学的アルゴリズムの実装との関係がわかりません。

「アルゴリズムとデータ構造」コースで扱われる資料は、整数や文字列を含むリスト、配列、ツリー、グラフなどの構造と、ソートや選択などの操作に集中する傾向があります。通常、正しい結果が1つだけある問題。科学的アルゴリズムに関して言えば、これは話の半分にすぎません。残りの半分は、実数と分析関数を推定する方法に関するものです。これは、「数値方法」(または「数値分析」; このようなコース)で見つけることができます-スライドのスクロールダウン):特殊関数の推定方法、積分と微分の推定方法など。ここでの主なタスクの1つは結果の精度を推定することであり、1つの一般的なパターンは、十分に正確になるまで見積もります。(Matlabがsin(x)一部のの値を推定するのと同じくらい簡単なことをどのように行うかを自問するかもしれませんx。)


簡単な例として、Matlabで画像のラドン変換を計算する短いスクリプトを次に示します。ラドン変換は、一連の投影角度にわたって画像を投影します。任意の角度に沿って投影を計算する代わりに、を使用して画像全体を回転させimrotate、投影テイクが常に垂直になるようにします。マトリックスのは各列の合計を含むベクトルを返すsumため、単純にを使用して投影を行うことができsumます。

imrotate必要に応じて、を使用して独自のコードを作成できますinterp2

%%# Home-made Radon Tranform

%# load a density map (image).  
A = phantom;

n_pixels = size(A, 1);  %# image width (assume square)

%# At what rotation angles do we want to take projections?
n_thetas = 101;
thetas = linspace(0, 180, n_thetas);

result = zeros(n_thetas, n_pixels);

%# Loop over angles
for ii=1:length(thetas)
    theta = thetas(ii);
    rotated_image = imrotate(A, theta, 'crop');
    result(ii, :) = sum(rotated_image);
end

%# display the result
imagesc(thetas, 1:n_pixels, result.');
xlabel('projection angle [degrees]');

かつて光線に沿った密度の積分であったものは、離散的にサンプリングされた画像の列の合計になり、変換された座標系で元の画像を補間することで見つかりました。


@nibot、このような詳細な回答をありがとうございます。「アルゴリズムとデータ構造」クラスを受講しましたが、そこに提示されている資料と科学的アルゴリズムの実装との関係がわかりません。あなたがくれたリンクを読んで、(論文ではなく本から)もっと簡単なアルゴリズムで練習を始めましょう。再度ありがとう
ダミアン

こんにちは、Damian、コメントを修正するために回答を編集しました。数値法/数値解析のコースや本であなたが求めるものを見つけると思います。
nibot

答えを通して!
ビクターソロキン

@nibot:編集してくれてありがとう。私はあなたがリンクした数値解析コースが本当に好きです。「有限インパルス応答フィルター」が補間にリンクされているのはなぜですか?なぜこれがEEの学生としてのカリキュラムの一部ではないのだろうか。しかたがない。ありがとう!
ダミアン

@Damian:サンプリング理論、補間/間引き、Z変換、双線形変換、およびFIR / IIRフィルターは、信号やシステム、通信システム、線形制御システム、DSPのイントロなどの学部EEクラス/ラボで教えられています。私は数値工学をコンピューター工学の二重学位プログラムの一部として取り入れました。EE全般に必要とは思わない。
エリックサン

3

nibotの優れた説明に加えて、さらに2、3ポイント。

  • MATLAB、Octave、SciPy / NumPyなどの数値計算環境は、C ++などの汎用プログラミング言語ですべてを自分で行うのに比べて、多くの労力を節約します。double配列とループをジャグリングすることは、複素数などのデータ型や積分などの操作を指先で行うこととは比較になりません。(確かに実行可能であり、優れたC ++コードは、ライブラリの抽象化とテンプレートが適度にクリーンで明確な場合もあり、桁違いに速くなる可能性がありますが、MATLABなどから始めるのは間違いなく簡単です)

  • MATLABには、画像処理デジタル信号処理などのための「ツールキット」もあります。

  • Mitraのデジタル信号処理は、離散時間、フィルター、変換などの基本を(MATLABで!)学ぶのに適した本です。

はい、Image Processing Toolbooxのドキュメントを読みました。私は非常に役立つように思えますが、私の質問はそのようなものを実装することに向けられていました。基本的に、数学的アルゴリズム/数式を取得して実装する方法を知りたかった(MathworksがIPTで行ったように)。思考パターンやいくつかのガイドラインについて知りたかった。Mitraの本を見てみましょう。ありがとう!
ダミアン

1
上記の答えに追加するために、ArmadilloなどのC ++ツールキットは、Matlabコードから高速C ++コードへの変換を大幅に簡素化できます。Armadilloの構文はMatlabに似ています。Armadilloのmexインターフェイスを介して、MatlabとC ++のコードを一致させることもできます。
mtall 14年

2

数値的方法。通常、大学の上級コースと教科書です。

DSPは通常、数値的手法と効率的な実装の交差点の近くにあります。効率を無視する場合、探しているのは、対象の技術論文の方程式に対して「十分に正確な」結果を生成する可能性のある数値近似法です。サンプリングされたデータを扱っている場合があります。サンプリング定理により、データ取得方法(事前フィルタリング)と、そのデータが与えられる結果の範囲または品質の両方に限界があります。

Matlab、数値レシピ、またはさまざまな画像/信号処理ライブラリに、目的の数値解法のための効率的なアルゴリズムまたはコードがある場合があります。しかし、場合によっては独自に計算する必要がある場合があるため、さまざまな数値解法の背後にある数学を知ることが役立ちます。そしてそれはそれ自体が大きな課題です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.