1

私は[K,K]マトリックスに格納された2Dデータを持っています。インデックスは、その系統-0.5<gamma<0.5によって定義される斜め座標系の座標(q_1, q_2)を表します。行列の直交座標ベース変換への斜め

q_x = q_1 
q_y = q_2 - gamma*q_1 

結果は、この画像に示されている:

oblique and rectangular systems

以下のコードは、この変換を達成する目標座標によって与えられるシステム、直交座標にデータを変換することですピクセル単位で表示することができます。誰もがよりエレガントでベクトル化されたアプローチが同じ結果を得ることを知っていますか?

% Oblique-to-rectangular coordinate transformation 
K = 10; % number of pixels 
gamma = 0.37; % some arbitrary strain position range (-0.5; 0.5) 
Koffset = (1-(-1).^(K-1))/4; % =0.5 when K is even, =0.0 when K is odd 

% Mock data 
S0 = rand(K,K); % data collected in the oblique coordinate system 

qindex = -ceil((K-1)/2) : floor((K-1)/2); % all the possible q-values, with the zero'th element in the middle. Must be in this order to comply with FFT's convention 

S = zeros(K,K); % data to be transformed to the rectangular coordinate system 

% let indices (i,j) run through all the positions of the oblique matrix 
for i=1:K 
    for j=1:K 
     % obtain the q-values corresponding to the current matrix position (i,j) 
     q1 = qindex(i); 
     q2 = qindex(j); 

     % apply the coordinate transformation to get the q-values in the rectangular system 
     qx = round(q1); 
     qy = round(q2-gamma*q1); 

     % apply periodic boundary condition 
     qy = qy - K*round((qy+Koffset)/K); % should be a unique value in the range of qindex 

     % find out the indices in the rectangular system 
     ii = i; 
     jj = find(qindex == qy); 

     % add the element 
     S(ii,jj) = S(ii,jj) + S0(i,j); 
    end 
end 

答えて

1

これを行うための最善の方法は、meshgridを使用して点のグリッドを作成し、あなたの変換を使用してグリッドを変形して、これらの場所で元の画像をサンプリングするinterp2を使用することです。

% Desired output range 
[xx,yy] = meshgrid(-3:0.01:3, -3:0.01:3); 

% Transform these X and Y coordinates to q1 and q2 coordinates 
q1 = xx; 
q2 = yy + gamma*q1; 

% Sample the original image using these coordinates where q1range and q2 
% range and the q1 and q2 values corresponding to each element in the image qdata 
output = interp2(q1range, q2range, qdata, q1, q2); 
関連する問題