3D 이미지가 있습니다. 이 이미지의 구형 파 분해를 수행해야하므로 데카르트 그리드의 3D 이미지를 구 좌표로 변환해야합니다.Cartesian Grid의 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
@ 도리안, 여기 SLERP는 어떻게 적용할까요? 나는 그것에 대해 생각했지만 그것을 이해할 수 없었다. Matlab에는 quatinterp가 있지만 내 벡터를 선택하려면 어떻게해야합니까? – user1696420
두 쿼터니언 (벡터가 아님)을 만들어야하는데, 이는 초기 회전과 정지 회전을 정의합니다. 하지만 직관적 인 것은 아닙니다. 기본적으로 모든 가상 구성 요소를 linspace로 변경 한 다음 원하는 쿼트로 변환해야합니다 (그러나 오일러 각을 사용하지 마십시오.) – Dorian