Измените цвет пикселя на графике изображения, не перекрашивая все в 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 мс. Отрегулируйте время на то, что работает для вас.