2017-04-22 5 views
1

Matlab xyz 3D空間で2Dイメージを回転しようとしています。 Iの画像をX軸回りに角度θ= i回転させたいとします。私は(here定義される)回転行列との乗算によってこれをやっている:3次元でのイメージの回転(Matlab)

これは私のコードです:

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つの値(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

加えて、あなたはrotxroty、そしてrotzを簡単に回転行列を生成するために使用することができます。

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

2次元画像のz方向の寸法は 'interp3'で回転しますが、実際には**カラー**寸法(RGB)したがって、結果は「重ね合わされた」画像のように見える。あなたが私の編集を見ることができる3Dスペースでイメージの2D平面を回転させたい場合 – user2999345

+0

ありがとう。それは完璧な意味合いがあります。最後の1つの質問:現在のコードは画像をそのエッジの周りで回転させます。画像をその中心点の周りで回転させることができる簡単な変更はありますか?または、画像を手動で移動して中心に配置する必要がありますか?たとえば、0°と90°の場合、画像の中心は一致しません。https://i.stack.imgur.com/MM55y.jpg – Ciprian

関連する問題