2017-04-22 15 views
1

Matlab xyz 3 차원 공간에서 2D 이미지를 회전하려고합니다. 이미지를 각도로 회전시키고 싶습니다. x 축을 기준으로 θ = i입니다.3 차원에서 이미지 회전 (Matlab)

이 내 코드입니다 : 나는 (here 정의 된) 회전 행렬 곱셈을 이용하여이 일을하고

x = linspace(-1,1,size(I,1)); 
[x0,y0,z0] = meshgrid(x,x,1); 
R = [1 0 0; 0 cosd(-i) -sind(-i); 0 sind(-i) cosd(-i)]; 
xy = [x0(:),y0(:), z0(:)]*R'; 
X = reshape(xy(:,1),size(x0)); 
Y = reshape(xy(:,2),size(y0)); 
Z = reshape(xy(:,3),size(z0)); 
rotatedI = interp3(x0,y0,z0,I,X,Y,Z, 'nearest'); 
rotatedI(isnan(rotatedI)) = 0; 

내가 점점 오전 오류는 보간 라인에 있습니다

Error using griddedInterpolant 
Interpolation requires at least two sample points in each 
dimension. 

여기 정확히 문제가 무엇이며 어떻게 해결할 수 있습니까?

이 코드는 2 차원으로 특수화 할 때 잘 동작하므로 혼란 스럽습니다. 어떤 설명이라도 대단히 감사합니다.

답변

0

입력 z 표 z0에 하나의 값 (1)이 포함되어 있지만 원하는 Z 표 Z에 여러 값이 포함되어있는 것이 문제입니다. 따라서이 단일 값을 여러 값으로 보간 할 방법이 없습니다.

입력 z 그리드에 여러 값을 할당하여 보간 할 수 있습니다.

I = im2double(imread('cameraman.tif')); 
I = cat(3,I,I,I); 
i = 10; 
x = linspace(-1,1,size(I,1)); 
[x0,y0,z0] = meshgrid(x,x,-1:1); % 3 z values 
R = [1 0 0; 0 cosd(-i) -sind(-i); 0 sind(-i) cosd(-i)]; 
xy = [x0(:),y0(:), z0(:)]*R; 
X = reshape(xy(:,1),size(x0)); 
Y = reshape(xy(:,2),size(y0)); 
Z = reshape(xy(:,3),size(z0)); 
rotatedI = interp3(x0,y0,z0,I,X,Y,Z, 'nearest'); 
rotatedI(isnan(rotatedI)) = 0; 
imshow(rotatedI); 

enter image description here

또한 rotx, rotyrotz 쉽게 회전 행렬을 생성하는 데 사용할 수 있습니다.

UPDATE는 3D 공간에서 이미지를 2 차원 평면을 회전 할 경우 보간을 사용할 필요가 없습니다와 같은 것을 할 수

:

I = im2double(imread('cameraman.tif')); 
i = 10; 
x = linspace(-1,1,size(I,1)); 
[x0,y0,z0] = meshgrid(x,x,-1:1); % 3 z values 
[x0,y0,z0] = meshgrid(x,x,1); % 3 z values 
R = [1 0 0; 0 cosd(-i) -sind(-i); 0 sind(-i) cosd(-i)]; 
xy = [x0(:),y0(:), z0(:)]*R; 
X = reshape(xy(:,1),size(x0)); 
Y = reshape(xy(:,2),size(y0)); 
Z = reshape(xy(:,3),size(z0)); 
warp(X,Y,Z,I); 
grid on 

enter image description here

+0

감사를 당신이 아주 많이. 그러나 결과 이미지는 원본에 겹쳐집니다. 3 차원 세계 좌표에서 실제로 회전하지 않습니다. 어떻게 든 Matlab의 FEX에서 'image3'과 함께 코드를 사용하여 이것을 달성 할 수 있습니까? 지금까지 이미지는 다음과 같습니다. https://i.stack.imgur.com/MDi9m.jpg – Ciprian

+0

'interp3'으로 회전 된 2D 이미지의 z 크기는 실제로 ** 색상 ** 크기 (RGB)입니다. 따라서 결과는 "겹쳐진"이미지로 보입니다. 3D 공간에서 이미지 2D 평면을 회전 시키려면 내 편집을 볼 수 있습니다 – user2999345

+0

감사합니다. 그건 완벽하게 이해가됩니다. 마지막 질문 하나 : 현재 코드가 가장자리를 중심으로 이미지를 회전시킵니다. 이미지를 중심점을 중심으로 회전시킬 수있는 간단한 수정이 있습니까? 또는 이미지를 수동으로 가운데로 이동해야합니까? 예를 들어 0 ° 및 90 °의 경우 이미지의 중심이 일치하지 않습니다. https://i.stack.imgur.com/MM55y.jpg – Ciprian