我想要用作色彩图的3D图像。我有实时数据流,根据我当前的位置,我希望我的图表根据我的3D图像显示某种颜色。
我之前使用大小为1080x1920
(2D图像)的图像成功地使用以下代码将其转换为图像。
Color=double(imresize(RGBparam.image,[81 144]))/255;
然后通过设置我的数据绘制它(我之前已经创建了图...那个代码无关紧要)size(myData(:,:1))
输出81x144 ... Ydata和Zdata也有相同的尺寸。
set(Fig.figim, 'CData', Color);
set(Fig.figim, 'XData', myData(:,:,1) + positionX)
set(Fig.figim, 'YData', myData(:,:,2) + positionY);
set(Fig.figim, 'ZData', myData(:,:,3) + positionZ);
这样工作得很好!现在我有一个新的3D图像。图片的尺寸为512x512x351
。我尝试使用相同的代码,但它不起作用。我试过这个:
Color=double(imresize(DICOMparam.Vd,[81 144]))/255;
然后我尝试这样绘制
set(Fig.figim, 'CData', Color);
set(Fig.figim, 'XData', myData(:,:,1) + positionX)
set(Fig.figim, 'YData', myData(:,:,2) + positionY);
set(Fig.figim, 'ZData', myData(:,:,3) + positionZ);
然后我得到错误:“颜色必须是M-by-N矩阵或M-by-N-by-3阵列”
现在我尝试改变事物,结果证明它是一个M-by-N-by-3阵列,但首先,我不想要这个......我想保留的不只是3个样本我的颜色贴图的z维度......其次......无论如何它都会向我吐出一堆错误。 总而言之,我只想在绘制具有x,y和z分量的数据时使用此3D色彩图。感谢您的帮助,如果有什么不清楚,请告诉我!
答案 0 :(得分:0)
想象您的2D / 3D图像为正方形/立方体颜色。您想要做什么(如果我理解正确的话),是myData中每个点的颜色取决于它落入该正方形/立方体的位置。
但是,这并不是'CData'在Matlab中的工作原理。它根据索引位置而不是矩阵中的实际值来映射颜色。因此,如果您的数据是M-by-N,则您的色彩图是M-by-N - 例如无论数据的实际值如何,myData(1,1)
都会根据myColormap(1,1)
进行着色。
在M-by-N-by-3阵列的情况下,这些仍然只是索引位置,但每种情况下的三个值都用RGB定义颜色。
可以做你想做的事情,你只需要直接告诉Matlab你想要应用于每个点的512 x 512 x 351立方体中的颜色。假设您有一些方法可以将myData中的x,y,z位置转换为512 x 512 x 351色彩空间中的近似坐标:
xData = myData(:,:,1);
yData = myData(:,:,2);
zData = myData(:,:,3);
% some magic here happens to make xData 1-512, yData 1-512, zData 1-351
% may require shifts, scaling, rounding as appropriate
% depends on what your myData contains exactly
% values should be integers
% now we find the positions of those points within the 512 x 512 x 351 colorspace
% size of newcmap should be 81 x 144 in your case
cind = sub2ind(size(Color),xData,yData,zData);
newcmap = Color(cind);
set(Fig.figim, 'CData', newcmap);