連続時間/空間/周波数で定義される信号処理アルゴリズムは、通常、離散グリッドで信号をサンプリングし、積分を合計に変換します(微分を差分に変換します)。空間フィルターは、畳み込みカーネルによる畳み込み(つまり、近傍の加重和)によって実装されます。
サンプリングされた時間領域信号のフィルタリングに関する膨大な知識があります。時間領域フィルターは、いずれかの有限インパルス応答フィルターとして実装されます。現在の出力サンプルは、前のN個の入力サンプルの加重和として計算されます。または無限インパルス応答フィルター。現在の出力は、前の入力と前の出力の加重和です。正式には、離散時間フィルターは、ラプラス変換の離散時間アナログであるz変換を使用して記述されます。双一次変換マップに他の(1つとMatlabの中に)。c2d
d2c
任意のポイントで関数をどのように評価しますか?
サンプリンググリッド上に直接存在しないポイントで信号の値が必要な場合、近くのポイントからその値を補間します。補間は、最も近いサンプルの選択、最も近いサンプルの加重平均の計算、または任意の複雑な分析関数をサンプリングされたデータに当てはめ、必要な座標でこの関数を評価するだけの簡単なものです。均一でより細かいグリッドへの補間はアップサンプリングです。元の(連続)信号にサンプリンググリッドの半分よりも細かい詳細(周波数)が含まれていない場合、連続関数はサンプルバージョン(ナイキストシャノンサンプリング定理)から完全に再構築できます。2Dで補間する方法の例については、バイリニア補間。
Matlabでは、interp1
またはinterp2
を使用して、1Dまたは定期的にサンプリングされた2Dデータを(それぞれ)griddata
補間したり、不規則にサンプリングされた2Dデータから補間したりできます。
各ボクセルを通過し、対応する式を計算するforループがありますか?
はい、正確に。
Matlabは、行列とベクトル(多次元配列)を操作するように設計されているため、明示的なforループを介してこれを行う必要がなくなります。Matlabでは、これは「ベクトル化」と呼ばれます。定積分はで近似することができsum
、cumsum
、trapz
、cumtrapz
、など
ゴンザレスとウッズの本「デジタル画像処理」を読みましたが、まだ迷っています。また、数値レシピの本シリーズについても読んでいます。それは正しい方法でしょうか?
はい、数値レシピは素晴らしい出発点です。これは非常に実用的であり、最終的に必要になる数値的手法のほとんどをカバーしています。(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]');
かつて光線に沿った密度の積分であったものは、離散的にサンプリングされた画像の列の合計になり、変換された座標系で元の画像を補間することで見つかりました。