在不重新绘制 Matlab/Octave 中的所有内容的情况下更改 imagesc 图中像素的颜色

Change the color of a pixel in an imagesc plot without repainting everything in Matlab/Octave

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

如果您想绘制每个 有更新的帧,您别无选择,只能在每次迭代中绘制所有内容。但是,您可以 最小化 闪烁(或者甚至可能删除它),方法是在下一次迭代之前在循环末尾放置一个 pause 。这样,在您绘制下一帧之前,它会让帧缓冲区有机会完全绘制到屏幕上。

类似于:

for idx = 1 : total_frames
    %// Do stuff

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

total_frames 将是您刷新绘图的总次数,在循环内您将执行必要的工作,然后绘制图形,然后暂停 0.1 毫秒。将时间调整为适合您的时间。

您可以使用图像的 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