Я пытаюсь добиться очень простой вещи в MATLAB. У меня есть последовательность изображений в массиве 4D в следующем формате: (номер кадра, высота, ширина, RGB).
Мой стек довольно маленький, его размер: 99 480 640 3
То, чего я пытаюсь добиться, - это определить, было ли изменение движения между n последовательными изображениями (изображения, снятые неподвижной камерой вокруг движущихся объектов).
Для этого моей наиболее очевидной идеей является вычитание разных изображений в стеке и их сохранение в другом стеке.
Вот очень простой код, который я пытался запустить:
vec = 1:size(stack,1)-5
dif = uint8(squeeze(abs(stack(vec,:,:,:) - stack(vec+5,:,:,:))));
Однако из-за ошибки памяти.
Error using -
Out of memory. Type HELP MEMORY for your options.
Если я не использую сжатие (нужно ли здесь использовать сжатие?), Я даже получаю системную ошибку Windows по поводу нехватки памяти.
В качестве запасного варианта я написал цикл for, который, кажется, работает, но только если я использую приведение uint8. Если нет, ему не хватает памяти и системная ошибка Windows.
for i = 1:size(stack,1)-5
dif(i,:,:,:) = uint8(abs(stack(i,:,:,:) - stack(i+5,:,:,:)));
end
Кроме того, для обработки этого небольшого набора данных (всего 99 кадров) требуется 20 секунд.
Можете ли вы сказать мне, как мне написать функцию, которая не пытается сохранить все в памяти? Эта команда должна требовать очень мало памяти для сравниваемых двух изображений, однако MATLAB пытается делать все операции в памяти по какой-то причине. Весь набор данных должен занимать 91 МБ в памяти, поэтому это не должно быть проблемой.
Кроме того, вы можете объяснить, нужно ли мне использовать сжатие или нет? Когда я пытаюсь получить одно изображение, тогда
dif = stack(1,:,:,:) - stack(5,:,:,:);
создает массив 4D, а
dif = squeeze(stack(1,:,:,:) - stack(5,:,:,:));
создает формат изображения. Но в приведенном выше цикле for он дает одинаковые результаты как со сжатием, так и без него. Почему это происходит?