私は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
SLERPはあなたに適したものですか?これは、基本的には3D回転の虚数のような回転表現であるクォータニオンに基づいています。 – Dorian
@Dorian、ここでSLERPをどのように適用しますか?私はそれについて考えましたが、それを理解できませんでした。 Matlabはquatinterpを持っていますが、私は2つのベクトルをどのように選択しますか? – user1696420
あなたは最初の回転と停止回転を定義する2クォータニオン(ベクトルではありません)を作成する必要があります。しかし直感的ではありません。 基本的には、すべての虚数成分をlinspaceで変化させ、それらのクォートをあなたが望むものに変換する必要があります。しかし、オイラー角は使用しないでください。 – Dorian