У меня есть два изображения, скажем, A и B, размеры которых не обязательно должны быть одинаковыми. A иметь размер 255×255 и B иметь размер 100×100. А размер патча для моей задачи 5х5. Что мне нужно сделать, так это сравнить все патчи в A со всеми патчами в B.
Каждый патч будет перекрываться с некоторыми соседними патчами. Чтобы очистить эту точку, первым патчем в A будет A(1:5,1:5) (нотация MATLAB). Второй патч A(2:6,1:5) и так далее, вплоть до A(251:255,1:5) в конце первой строки и до A(251:255,251:255) для последнего патча в A.
Мне нужно сравнить каждое из этих исправлений с всеми исправлениями в B. Как видите, есть 251*251 патчей в A и 96*96 патчей в B. Так что есть много сравнений, которые нужно сделать. А сравнение — это просто евклидово расстояние, т. е. я просто возьму разность двух участков и суммирую квадраты. Для каждого сравнения патчей я получу в результате скалярное значение.
Я реализовал это в MATLAB, но выполнение занимает несколько минут. Поэтому, пожалуйста, предложите мне самый быстрый способ реализовать это. Этот раздел является узким местом во всем моем проекте. Код, который я написал, приведен ниже. Я не эксперт, так что, пожалуйста, простите за ошибки.
row = size(A,1);
col = size(A,2);
row2 = size(B,1);
col2 = size(B,2);
patch_long = zeros(5,5,(row2-4)*(col2-4));
idx = 1;
for i = 1:row2-4
for j = 1:col2-4
patch_long(:,:,idx) = B(i:i+4,j:j+4);
idx = idx+1;
end
end
%// I rearranged 'B' matrix as 3d matrix with each patch arranged like
%// slide behind one by one
parfor m = 1:row-4
for n = 1:col-4
temp1 = bsxfun(@minus,(A(m:m+4,n:n+4)),patch_long);
temp2 = sum(sum(temp1.^2));
count = sum(temp2 <=threshold);
if count > 1
% Do xyzend
end
end
end
%// count counts how many patches in 'B' are close to a particular patch in 'A'.
gpuDeviceв командной строке? - person Rody Oldenhuis   schedule 25.03.2014