У меня есть массив Nx2 K1
с расположением N ключевых точек и трехмерный массив WxHx3 Kart1(width,height,coordinates)
, который отображает координаты для каждого пикселя изображения. Для каждой ключевой точки в K1
я хочу прочитать местоположение пикселя в Kart1
и оценить координаты (поиск минимума/максимума или вычислить среднее значение) в ядре 3x3 вокруг него и присвоить значение текущему пикселю в KPCoor1
.
Мой текущий подход выглядит следующим образом:
for ii=1:length(K1(:,1)) %for every keypoint in K1
MinDist=sqrt(sum(Kart1(K1(ii,2)-1,K1(ii,1)-1,:).^2)); %Calculate distance
xShift=0;
yShift=0;
for kk=-1:1 %for every pixel in a 3x3 kernel...
for ll=-1:1
Distance=sqrt(sum(Kart1(K1(ii,2)+kk,K1(ii,1)+ll,:).^2));
if Distance<MinDist %... if the current distance is smaller than MinDist
MinDist=Distance; %... update MinDist...
xShift=kk; %... and take the kernel coordinate of the pixel
yShift=ll;
end
end
end
KP1Coor(ii,:)=Kart1(K1(ii,2)+xShift,K1(ii,1)+yShift,:); %assign the coordinates of the pixel with the minimal distance in kernel.
end
и он работает, но уродлив, и я сомневаюсь, что он делает то, что я хочу. Я немного смущен "многомерностью" вопроса, не знаю многих функций для оценки ядер и не могу придумать, как использовать функции векторизации типа bsxfun()
или логические операции (значит, я застрял, и мой мозг сухо :/)
Любые предложения о том, как устранить эти циклы/исправить код?
xShift=-1
иyShift=-1
внутри первого вложенного цикла, не так ли? Кроме того, вам нужноMinDist
в качестве вывода? - person Divakar   schedule 12.08.2014bsxfun
! Вы сказали, что уже реализовали его эффективную версию, и я подумал, что не буду возражать против немногоshowdown of benchmarks
по сравнению с представленной здесь, если вы тоже хотите :) Если вы это сделаете, возможно, вы можете отредактировать свой вопрос с ним или сделайте свое собственное решение здесь, хотя я думаю, что последнее было бы неплохо. - person Divakar   schedule 13.08.2014