0

私は3D画像を持っています。私はこの画像の球面波分解を行う必要があるので、私はデカルトグリッドの3D画像を球面座標に変換する必要があります。デカルト格子からのMatlabの球形補間

以下はあまりにも長いですが、私が望むものの要点は、球形の座標を補間するマッピングが必要なことです。特に、私の起源の周りには欠けている情報がたくさんあります。

まず、私は球面変換を行います。

[ydim,xdim,zdim] = size(myimg); 

    [x,y,z] = meshgrid(1:xdim, 1:ydim, 1:zdim); 
    x = x - median(x(:)); y = y - median(y(:)); z = z - median(z(:)); 
    [phis, thetas, rs] = cart2sph(x,y,z); 

ここから私は立ち往生しています。どのようにして私のphisとthetaとrを使って円弧に沿った補間を行うことができますか(私はそれが球なので弧であると仮定します)。

私は実際にこれを少し調べ、補間のためにこのコードをまとめましたが、それが動作することを確認することはできません。主に、そのほとんどが同様の問題からコピーされ、変更されているためです。

function [theta0,phi0,rho0] = my_interp(X, Y, Z, nTheta0, nPhi0) 
% forget about spherical, let's just interpolate in cartesian then convert 
% to spherical. 
[theta, phi, V] = cart2sph(X, Y, Z); 

% X,Y,Z are meshgrid output from above code snippet. 
P = [2 1 3]; 
X = permute(X, P); 
Y = permute(Y, P); 
Z = permute(Z, P); 
V = permute(V, P); 

% create a cartesian interpolant, and we'll use it in spherical. 
F = griddedInterpolant(X,Y,Z,V); 

% prepare grid for meshing (we'll mesh xyz data, not theta,phi) 
theta0 = linspace(-pi, pi, nTheta0); 
phi0 = linspace(-pi/2, pi/2, nPhi0); 
[theta0, phi0] = meshgrid(theta0, phi0); 

[x_,y_,z_] = sph2cart(theta0, phi0, 1); % !! here is why I get confused. my 
% radius on the sphere is not just 1, I have changing radius. Am I really  
% missing the key insight here? On the other hand, I don't know how to  
% account for all the r's on the image anyways so I can't change this. 
rho0 = F(x_,y_,z_); 

theta0 = repmat(theta0, 1, 1, size(X, 3)); 
phi0 = repmat(phi0, 1, 1, size(X, 3)); 
rho0 = repmat(rho0, 1, 1, size(X, 3)); 
end 
+0

SLERPはあなたに適したものですか?これは、基本的には3D回転の虚数のような回転表現であるクォータニオンに基づいています。 – Dorian

+0

@Dorian、ここでSLERPをどのように適用しますか?私はそれについて考えましたが、それを理解できませんでした。 Matlabはquatinterpを持っていますが、私は2つのベクトルをどのように選択しますか? – user1696420

+0

あなたは最初の回転と停止回転を定義する2クォータニオン(ベクトルではありません)を作成する必要があります。しかし直感的ではありません。 基本的には、すべての虚数成分をlinspaceで変化させ、それらのクォートをあなたが望むものに変換する必要があります。しかし、オイラー角は使用しないでください。 – Dorian

答えて

0

代わりcartedian座標のグリッドを作成し、球状にそれらを変換する、あなたは、球座標のグリッドを作成デカルトにそれらを変換し、それらの座標で画像値を見つけるためにinterp3を使用したいです。

球座標グリッドはmeshgrid(0:maxR,0:phiStep:2*pi,0:thetaStep:pi)のようなものです。

+0

私は50x50x2の画像を持っています。しかし、Rは25まで(maxR)になります。あなたがmeshgrid(linspace(0,2 * pi、180)、linspace(0、pi、90)、linspace(0、maxR、100))を使って言うとき、私は巨大な配列を取得します。私の問題はこれらのZ次元です(100です)。しかし、私は100対2で解決するとは思わない。これは内挿の性質ですか?私の主な問題は、ポイントがどのように原点にうまく分配されなかったかだけでした。 – user1696420

+0

私はあなたの質問を理解していないと思います。 50x50x2の画像を持っている場合は、3次元全体があまりないので、どのような3D情報をそこから得ることができるのかよく分かりません。そして、「ポイントは原点にきれいに配られていなかった」ということはどういう意味ですか?球面座標では、大きなrのために十分な密度で標本を採取すると、小さなrのためにオーバーサンプリングします。原点は常に厄介です:r = 0の場合、すべてのphiとtheta(冗長な情報)に対して一定の値が得られます。そのための解決策はありません。 –

+0

単純に言えば、デカルトボクセル(すなわち、3D画像における画像ピクセル強度)に対してf(r、theta、phi)を有する。これらは明らかに離散ですが、どのようにして任意のthetaとphi 'に対して私にf(r、theta'、phi ')を与える補間を得ることができますか?私はf(r、theta、phi)を含むthetaとphiについて0から2piと0からpiに至る積分を持っており、この積分のためにこの補間を使う必要があります。 – user1696420