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);