Измените цвет пикселя на графике изображения, не перекрашивая все в Matlab/Octave

У меня есть цикл for, где я хотел бы рисовать на каждом шаге новый пиксель в графике изображения. Сейчас я перекрашиваю всю фигуру, но фигура мигает, и я знаю, что это неправильный способ сделать это. Может ли кто-нибудь помочь найти подходящую функцию для выполнения этой задачи?

2 ответа

Решение

Вы можете обратиться к данным в каждом пикселе с помощью CData свойство изображения без необходимости снова и снова закрывать и перерисовывать фигуру, оси или объекты осей. В итоге получается примерно в 1,5 - 2 раза быстрее, чем при попытке создать новый объект изображения или просто при вызове imagesc() вновь и вновь.

В этих петлях не забудьте drawnow call или 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

У вас нет выбора, кроме как рисовать все на каждой итерации, если вы хотите нарисовать каждый кадр, который имеет обновление. Тем не менее, вы можете минимизировать мерцание (или, возможно, даже удалить его), поместив pause в конце вашего цикла перед следующей итерацией. Таким образом, у буфера кадров будет возможность полностью отрисоваться на экране, прежде чем вы начнете рисовать следующий кадр.

Что-то вроде:

for idx = 1 : total_frames
    %// Do stuff

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

total_frames будет общее количество раз, когда вы обновляете график, и внутри цикла вы выполняете необходимую работу, затем вы рисуете фигуру, затем делаете паузу на 0,1 мс. Отрегулируйте время на то, что работает для вас.

Другие вопросы по тегам