Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

ファンビーム投影

メモ

平行パスに沿った線積分から投影データを作成する方法の詳細については、ラドン変換を参照してください。ファンビーム投影データをパラレル ビーム投影データに変換するには、関数 fan2para を使用してください。

関数 fanbeam は特定の方向にイメージ行列の "投影" を計算します。2 次元関数 "f(x,y)" の投影は、線積分の集合です。関数 fanbeam は 1 つのソースから出るファンの形状をしたパスに沿って線積分を計算します。イメージを表すため、関数 fanbeam はイメージの中心の周りにソースを回転させることで、さまざまな角度からイメージの複数の投影を行います。次の図は、指定した回転角での 1 つのファンビーム投影を示しています。

回転角 θ でのファンビーム投影

A set of fan beams originate at a vertex, pass through an image, and are captured by a row of sensors.

関数 fanbeam を使用してファンビーム投影データを計算する場合、引数としてイメージと、ファンビーム投影の頂点と回転の中心 (イメージ内の中心ピクセル) との距離を指定します。関数 fanbeam は、イメージのサイズと、指定された名前と値の引数の値からビームの数を決定します。

名前と値の引数 FanSensorGeometry は、センサーの配置方法 ("arc" または "line") を指定します。

ファン センサーの幾何形状説明
"arc"fanbeam は 1 度の間隔で弧に沿ってセンサーを配置します。FanSensorSpacing パラメーターを使用し、各ビーム間の角度を指定することでセンサー間の距離を制御します。これは既定のファン センサーの幾何形状です。
"line"fanbeam は弧ではなく、直線に沿ってセンサーを配置します。FanSensorSpacing パラメーターを使用し、x 軸に沿ってセンサー間の距離をピクセル単位で指定します。

FanRotationIncrement パラメーターは回転角の増分を指定します。既定の設定では、fanbeam は中心ピクセルの周りでソースを 1 度の間隔で回転することにより、さまざまな角度での投影を行います。

次の図は、これらの幾何配置を示しています。最初の図は、FanSensorGeometry"arc" (既定の設定) と設定した場合に、関数 fanbeam で使用される形状を示します。ビームの角度の刻みを指定することでセンサー間の距離を指定する方法を確認してください。

弧の幾何配置を利用したファンビーム投影

Fan-beams radiating from a vertex and hitting sensors in an arc geometry. Sensors have a uniform angular spacing.

次の図は、FanSensorGeometry"line" と設定した場合に、関数 fanbeam で使用される形状を示します。ピクセル単位でこれらの間の距離を "x" 軸に沿って設定することによりセンサーの位置を設定する方法を、この図の中で確認してください。

線幾何形状をもつファンビーム投影

Fan-beams radiating from a vertex and hitting sensors in a line geometry. Sensors have a uniform linear spacing.

ファンビーム投影データからのイメージの再構成

ファンビーム投影データからイメージを復元するには、関数 ifanbeam を使用します。この関数では、投影データとファンビーム投影の頂点と投影データが作成されるときの回転の中心までの距離を引数として設定します。たとえば、次のコードは投影データ P と距離 D からイメージ I を再作成します。

I = ifanbeam(P,D);

既定で、関数 ifanbeam は、1 度間隔のビームと 360 度全体にわたり 1 度刻みで増分する投影の弧状幾何形状ファン センサーを使用してファンビーム投影データが作成されていると想定します。関数 fanbeam と共に、ifanbeam の名前と値の引数を使用して投影データのこれらの特性に他の値を設定できます。投影データの作成時に使用されたこれらの名前と値の引数と同じ値を使用してください。これらのパラメーターの詳細については、ifanbeamを参照してください。

関数 ifanbeam は、関数 fan2para を使用してファンビーム投影データをパラレル ビーム投影データに変換した後で、関数 iradon を呼び出してイメージを再構成します。このため、関数 ifanbeam は、関数 iradon に渡す特定の iradon パラメーターをサポートしています。関数 iradon の詳細については、逆ラドン変換を参照してください。

ファンビーム逆投影を使用したイメージの再構成

この例では、fanbeam および ifanbeam を使用してサンプル イメージの投影を行い、その投影からイメージを再構成する方法を示します。

関数 phantom を使用して、Shepp-Logan の頭部ファントムのテスト イメージを作成します。ファントム イメージは、人頭の実際の断層撮影イメージで見られるさまざまな要素を示します。

P = phantom(256);
imshow(P)

Figure contains an axes object. The axes object contains an object of type image.

テスト イメージのファンビーム投影データを、センサーの間隔を変化させる名前と値の引数 FanSensorSpacing を使用して計算します。この例ではファンビームの円弧の形状を使用するため、センサーの間隔をビームの角度間隔で指定します。2 番目は一度に配置し、3 番目は 0.25 度に配置します。各呼び出しで、投影の頂点と回転の中心との間の距離は一定で 250 ピクセルです。さらに、fanbeam は中心のピクセルの周りを 1 度刻みで投影を回転させます。

D = 250;

dsensor1 = 2;
F1 = fanbeam(P,D,"FanSensorSpacing",dsensor1);

dsensor2 = 1;
F2 = fanbeam(P,D,"FanSensorSpacing",dsensor2);

dsensor3 = 0.25;
[F3,sensor_pos3,rot_angles3] = fanbeam(P,D,"FanSensorSpacing",dsensor3);

投影データ F3 をプロットします。fanbeam は 0 度から 360 度までの回転角で投影データを計算するため、180 度のオフセットの位置で同じパターンが得られます。同じ特徴が両側からサンプルされています。

figure
imagesc(rot_angles3,sensor_pos3,F3)
colormap(hot); colorbar
xlabel("Fan Rotation Angle (degrees)")
ylabel("Fan Sensor Position (degrees)")

Figure contains an axes object. The axes object with xlabel Fan Rotation Angle (degrees), ylabel Fan Sensor Position (degrees) contains an object of type image.

ifanbeam を使用してファンビーム投影データからイメージを再構成します。個々の再構成において、ファン センサーの間隔を以前に投影データを作成したときに使用した間隔に合わせます。この例では、名前と値の引数 OutputSize を使用して、各再構成の出力サイズが元のイメージ P のサイズと同じになるように制約を与えています。再構成の質が投影のビーム数を増やすことでどのくらい向上するかを、出力で確認してください。イメージの作成に使用したビーム間隔は、最初のイメージ Ifan1 では 2 度、2 番目のイメージ Ifan2 では 1 度、3 番目のイメージ Ifan3 で 0.25 度です。

output_size = max(size(P));

Ifan1 = ifanbeam(F1,D, ...
       "FanSensorSpacing",dsensor1,"OutputSize",output_size);
figure, imshow(Ifan1)
title("Ifan1")

Figure contains an axes object. The axes object with title Ifan1 contains an object of type image.

Ifan2 = ifanbeam(F2,D, ...
       "FanSensorSpacing",dsensor2,"OutputSize",output_size);
figure, imshow(Ifan2)
title("Ifan2")

Figure contains an axes object. The axes object with title Ifan2 contains an object of type image.

Ifan3 = ifanbeam(F3,D, ...
       "FanSensorSpacing",dsensor3,"OutputSize",output_size);
figure, imshow(Ifan3)
title("Ifan3")

Figure contains an axes object. The axes object with title Ifan3 contains an object of type image.