Сферическая интерполяция в Matlab из декартовой сетки

У меня есть 3D-изображение. Мне нужно взять разложение сферической волны этого изображения, следовательно, мне нужно преобразовать мое трехмерное изображение в декартовой сетке в сферические координаты.

Если приведенное ниже слишком длинное для чтения, суть в том, что я хочу, - это то, что я хочу получить отображение, которое будет интерполировать сферические координаты, так что, особенно вокруг моего источника, у меня не будет много пропущенной информации.

Сначала я делаю сферическое преобразование.

    [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, thetas и 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

1 ответ

Вместо того, чтобы создавать сетку координат в координатах и ​​преобразовывать их в сферические, вы хотите создать сетку из сферических координат, преобразовать их в декартовы, а затем использовать interp3 чтобы найти значения изображения в этих координатах.

Сферическая координатная сетка может быть чем-то вроде meshgrid(0:maxR,0:phiStep:2*pi,0:thetaStep:pi),

Другие вопросы по тегам