2017-05-11 144 views
0

我從以下簡單代碼生成此3D圖像。如何轉換圖像座標至笛卡爾座標

% Input Image size 
imageSizeY = 200; 
imageSizeX = 120; 
imageSizeZ = 100; 

%# create coordinates 
[rowsInImage, columnsInImage, pagesInImage] = meshgrid(1:imageSizeY, 1:imageSizeX, 1:imageSizeZ); 

%# get coordinate array of vertices 
vertexCoords = [rowsInImage(:), columnsInImage(:), pagesInImage(:)]; 

centerY = imageSizeY/2; 
centerX = imageSizeX/2; 
centerZ = imageSizeZ/2; 
radius = 28; 

%# calculate distance from center of the cube 
sphereVoxels = (rowsInImage - centerY).^2 + (columnsInImage - centerX).^2 + (pagesInImage - centerZ).^2 <= radius.^2; 

%# Now, display it using an isosurface and a patch 
fv = isosurface(sphereVoxels,0); 
patch(fv,'FaceColor',[0 0 .7],'EdgeColor',[0 0 1]); title('Binary volume of a sphere'); 
view(45,45); 
axis equal; 
grid on; 
xlabel('x-axis [pixels]'); ylabel('y-axis [pixels]'); zlabel('z-axis [pixels]') 

我試圖與isosurface和其他一些卷可視化工具繪製圖像,但仍然是我從圖中不少驚喜。

  1. 該代碼已被寫入符合圖像座標系(例如參見:vertexCoords),這是我所假定的左手座標系。儘管如此,圖像顯示在笛卡爾(右手)座標系中。我試圖看到如下圖所示,但根本沒有發生。
  2. 我想知道如果可視化功能已被寫入顯示圖像的方式,他們做。

圖像座標系: Image coordinate system

展望未來,有我寫,例如,如果我有一個輸入圖像sphereVoxels如上述,除了可視化它的代碼的其它方面,我想要查找圖像中的北,東南,西,頂部和底部位置,以及數量和計算頂點的座標以及更多。

我預計如果我不堅持一個座標系統,並且考慮到可視化工具主要使用右手座標系統,我可能會對此產生困惑,我想從一開始就堅持這一點。但是,我真的不知道如何去做這件事。

右手座標系:

Right-hand coordinate system

任何建議通過它來獲取?

+0

你想改變軸的方向嗎? 'set(gca,'XDir','reverse','YDir','reverse');'在這段代碼的結尾爲你工作? – user2999345

+0

嗨,謝謝。這實際上只改變軸的方向,因此隻影響可視化。我想要的是一個永久性的轉換,例如,如果我想找到一個位置的像素值,我會使用'P(x,y,z)',而不是'P(y,x,z)'。 – User1333

回答

0

當您撥打meshgrid時,切換軸的尺寸爲xy(與ndgrid相反)。例如,對於您的情況,這意味着rowsInImage[120x100x200] = [x,y,z]陣列,而不是[100x120x200] = [y,x,z]陣列,即使meshgrid是使用y,x,z順序的參數調用的。我會改變這兩條線在經典x,y,z順序:

[columnsInImage, rowsInImage, pagesInImage] = meshgrid(1:imageSizeX, 1:imageSizeY, 1:imageSizeZ); 
vertexCoords = [columnsInImage(:), rowsInImage(:), pagesInImage(:)]; 
+0

謝謝@ G.J。我現在已經嘗試過了,它仍然不會給我我想要的東西。我需要從頭開始轉換座標系的東西。 – User1333

相關問題