使用image.CData在MATLAB中快速重绘图像

使用image.CData在MATLAB中快速重绘图像,image,matlab,matlab-figure,Image,Matlab,Matlab Figure,我想画一次,然后更新(非常)经常和重画(较少)经常在MATLAB中的图像。我的图像是一个被更新和重画的向量。为了显示这个图像,我使用了I=imagesc(重塑(数据,nVoxels))来绘制,并使用I.CData(:)=data来更新。(重画单独处理。)这很好 现在,为了与x-y坐标系(x水平,y垂直-非常标准)对应,重塑(数据,nVoxels)的第一个维度是x,第二个维度是y,我需要这样画: I = imagesc(reshape(data, nVoxels)'); axis('xy');

我想画一次,然后更新(非常)经常和重画(较少)经常在MATLAB中的图像。我的图像是一个被更新和重画的向量。为了显示这个图像,我使用了
I=imagesc(重塑(数据,nVoxels))
来绘制,并使用
I.CData(:)=data
来更新。(重画单独处理。)这很好

现在,为了与x-y坐标系(x水平,y垂直-非常标准)对应,
重塑(数据,nVoxels)
的第一个维度是x,第二个维度是y,我需要这样画:

I = imagesc(reshape(data, nVoxels)');
axis('xy');
但是我现在如何快速更新图像数据呢

到目前为止,我发现我需要做些什么

I.CData = reshape(data, nVoxels)';
但我更愿意像以前一样,更新CData而不必重新分配数据,也不必转置数据


可能吗?我特别感兴趣的是在循环中经常更新;重绘是使用计时器独立处理的。

在创建翻转图像时,通过设置x和y限制,并旋转轴,可以避免转置:

I = imagesc([nVoxels(2) 1], [1 nVoxels(1)], reshape(data, nVoxels));
camroll(90);
然后使用

I.CData(:) = data;
再说一遍


但是,与使用
drawnow()

更新图形相比,转置时间可能可以忽略不计。更改I.CData会重新绘制(即,如果更改了CData)。这里有一个例子:
nVoxels=[35];数据=兰特(nVoxels);I=图像SC(重塑(数据,nVoxels));暂停(1);数据=兰特(nVoxels);I.CData(:)=数据I.CData(:)=数据;仅当MATLAB进程空闲时才重新绘制图形。否则,您需要调用drawnow()来显式更新显示。作为OP,我可以说这对我的情况没有问题(这实际上是我想要的)-我想要经常更新,并且只在需要时重新绘制。我会相应地更新我的问题。至于答案本身:你的
I=imagesc([nVoxels(2)1],[nVoxels(1)1],重塑(data,nVoxels))行显示图像的方向与my
I=imagesc(重塑(数据,nVoxels))的方向不同行(因为缺少转置)。如果我必须翻转图像数据,您设置递减限制的想法会很有帮助,但这无助于摆脱Transpose操作。这根本不是一个坏主意。但它不仅会旋转图像,还会旋转整个
轴以及所有子项,因此任何注释等也会受到影响(请参阅手册:“
camroll
设置轴
CameraUpVector
属性,并将
CameraUpVector模式
属性设置为
manual
”)。因此,在维护图像和轴之间的关系时,它并没有达到我使用转置操作所达到的效果。但这给我带来了另一个想法,我可以在回答中提出。(我曾考虑使用MATLAB
rotate
函数来显示旋转后的图像。但这不起作用,因为此函数对
图像的
扩展数据和
ydata
进行操作,它们只确定图像的边界,而不确定单个像素的方向或位置。)