更改图像c图中像素的颜色,而不重新绘制Matlab / Octave中的所有内容

时间:2015-02-12 12:01:47

标签: matlab octave

我有一个for循环,我想在每个步骤中绘制一个imagesc图中的新像素。我正在重新绘制整个数字,但这个数字是闪烁的,我知道这不是正确的方法。任何人都可以帮忙找到合适的功能来完成这项任务吗?

2 个答案:

答案 0 :(得分:3)

您可以使用图像的CData属性来处理每个像素中的数据,而无需一遍又一遍地关闭和重绘图形,轴或轴对象。最终比尝试生成新图像对象或只是反复调用imagesc()快约1.5倍 - 2倍。

在这些循环中,不要忘记drawnow调用,否则MATLAB将尝试跳过图形绘制,直到循环完成。

示例代码:

data = rand(200, 200); % Data to display

figure(1) % Make a figure
imgHand = imagesc(data); % Display data in it

% Naive way - call imagesc() each time.
% Slow.  Don't do it this way.
for k = 1:numel(data);

    data(k) = data(k) + 10*rand(1,1); % Update data
    imagesc(data) % Redraw it by calling imagesc()

    drawnow; % Display updated figure

end

% Faster way - address CData of image object directly
% 1.5-2x faster than above method
for k = 1:numel(data);

    data(k) = data(k) + 10*rand(1,1); % Update data
    set(imgHand, 'CData', data); % Change CData property of object

    drawnow; % Display updated figure

end

答案 1 :(得分:1)

如果要绘制具有更新的每个框架,则无法选择在每次迭代时绘制所有内容。但是,您可以最小化闪烁(或者甚至可以删除它),方法是在下一次迭代之前在循环结束时放置pause。这样,在绘制下一帧之前,它将为帧缓冲区提供完全绘制到屏幕的机会。

类似的东西:

for idx = 1 : total_frames
    %// Do stuff

    drawnow; %// Draw frame
    pause(0.1); %// Pause
end

total_frames将是您刷新绘图的总次数,并且在循环内部您将完成必要的工作,然后绘制图形,然后暂停0.1 ms。调整适合你的时间。