Мне дали задание переупорядочить несколько случайно размещенных видеокадров в правильном порядке. Мне удалось сделать это, используя каждый кадр в качестве эталона один раз, и найти два ближайших кадра с точки зрения структуры для этого эталонного кадра.. предположительно, что эти два ближайших кадра будут теми, что позади и после этого кадра в видео. Найдя два ближайших кадра для каждого видеокадра, я вычислил возможный путь.
Моя проблема, однако, когда дело доходит до производительности, особенно при подсчете очков. К сожалению, это очень неэффективно, и время работы только для 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%, однако проблема в том, что мне нужно создать исполняемый файл, и я не уверен, что достигну того же представление..