Мне поручено переупорядочить несколько случайно размещенных видеокадров в нужном порядке. Мне удалось это сделать, используя один кадр в качестве ссылки один раз и найти два ближайших кадра в терминах структуры для этого кадра ссылок. Предположительно, эти два ближайших кадра будут теми, которые стоят за и после этого кадра в видео. После нахождения двух ближайших кадров для каждого видеокадра, я бы вычислил возможный путь.Эффективный способ использования функции ssim() в Matlab для сравнения структур изображений (или любой другой альтернативы)
Моя проблема, однако, когда дело доходит до производительности, особенно при подсчете очков. Это очень неэффективно, к сожалению, и время выполнения для 72 кадров (320x240) составляет примерно 80 секунд только при подсчете очков. Я не слишком хорошо знаком с Matlab (или любым аналогичным языком), но это то, что я делаю для озвучивания прямо сейчас:
for i =1: n_images,
current_image = Images{1,i};
%obtain score pairs image similarity
for j = 1:n_images,
if i ~= j,
scores(1,j) = ssim(Images{1,j}, current_image);
end
end
[svalues, index] = sort(scores,'descend');
Closest(1,i) = index(1,1);
Closest(2,i) = index(1,2);
%Closest consists of a 2 x n_images matrix, where for each frame index, there are two
%column values, which are the indexes of the closest frames.
end
Может кто-нибудь дать мне несколько советов для оптимизации, или еще предложений для лучшего способа забил?
Изменить: Изображения нормализованы и преобразуются в оттенки серого
Редактировать # 2: Я попытался с использованием потоков путем добавления parfor в цикле подсчета очков, что позволило улучшить производительность примерно на 50%, однако проблема в том, что мне нужно чтобы создать исполняемый файл, и я не уверен, что я бы достиг такой же производительности.