256x256の射影行列があります。各行は、等しい角度で取られた投影です。matlabを使用して逆投影で元の画像を生成する必要がありますが、matlabにはあまり詳しくありません。コードサンプルやアルゴリズムを教えていただけますか?それらを使用して元の画像を生成できなかった同様のコードをいくつか見つけました。
1 に答える
iradon
Image Processing Toolboxがある場合、これはコマンドを使用すると比較的簡単になります。そうしないと、独自のバージョンをロールする必要があるため、少し難しくなります。どうやらあなたはこれを使うことができないようです、しかし私が使うならばそれが価値があるもののために私は画像を手に入れます:
I = iradon(Pteta',linspace(0,179,size(Pteta,1));
では、どうすればこれを自分で行うことができますか?私はあなたに答えを与えずに途中であなたを助けようとします-これは結局のところ宿題です!
まず、0度の投影について考えます。投影している軸の単位が1,256であると想像してください。次に、画像全体のこれらの座標の逆投影を想像してください。次のようになります。
同様に、90度の投影は次のようになります。
かっこいい、これらの行列はを使用して取得できますが、[X, Y] = meshgrid(1:256);
軸外投影についてはどうでしょうか。極/デカルト座標の変換のように、角度のある線に沿った距離を考えてみてください。
theta = 45 % projection angle in degrees
t = X*cosd(theta) + Y*sind(theta);
そしてそれは動作します!
しかし、問題があります!値が350を超えていることに注意してください。また、それは一種の中心から外れています。正方形の対角線が辺よりも長いため、座標は投影の長さを超えています。これを解決する方法はあなたに任せますが、最終的な画像は最初の投影よりも小さくなり、異なる単位(1から256ではなく-127から128)を使用する必要がある場合があります。
これで、これらの角度の投影にインデックスを付けて、画像全体の実際の値を逆投影することができます。ただし、値が整数ではないため、2番目の問題があります。それらを丸めることもできます。これは最近隣内挿法と呼ばれますが、最良の結果は得られません。
proj = Pteta(angle,:);
% add projection filtering here
t = X*cosd(theta) + Y*sind(theta);
% do some rounding/interpolating to make t all integers
imagesc(proj(t));
オフセンターバージョンの場合、この画像または類似のものが得られます。
今、あなたはすべての角度に対してこれを行う必要があり、それらをすべて合計します。