0

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 
+0

SLERP이 당신에게 적합한 재료입니까? 기본적으로 3D 회전의 허수와 같은 회전 표현 인 쿼터니언을 기반으로합니다. – Dorian

+0

@ 도리안, 여기 SLERP는 어떻게 적용할까요? 나는 그것에 대해 생각했지만 그것을 이해할 수 없었다. Matlab에는 quatinterp가 있지만 내 벡터를 선택하려면 어떻게해야합니까? – user1696420

+0

두 쿼터니언 (벡터가 아님)을 만들어야하는데, 이는 초기 회전과 정지 회전을 정의합니다. 하지만 직관적 인 것은 아닙니다. 기본적으로 모든 가상 구성 요소를 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')를주는 interpolant를 얻을 수 있습니까? 나는 f (r, theta, phi)가 포함 된 theta와 phi에 대해 0에서 2pi와 0pi로 이동하는 적분을 가지고 있으며,이 적분에이 interpolant를 사용해야합니다. – user1696420