Если я интерпретирую уравнение справа, у вас есть координаты строки/столбца k
. Для каждой пары координат столбца/столбца у вас есть ai1,ai2
, вы хотите вычислить этот термин в скобках выражения в своем сообщении. Это приводит к k
матрицам, и тогда у вас будет матрица d
, такая же, как и ваше изображение, и она вычисляет продукт всех этих матриц вместе.
Однако, для численной устойчивости, если вы берете логарифмическую сумму, добавляете термины, а затем берете экспоненту результата, вы получите то же самое, и это на самом деле намного быстрее (наконечник шляпы переходит к Никос М. для наконечника).
Хотелось бы отметить, что x
, похоже, имеет дело с координатами изображения и не имеет ничего общего с интенсивностью самого изображения. Это имеет смысл, учитывая то, что я прочитал из газеты. В документе, как представляется, подчеркивается, что эта дистанционная мера рассматривает пространственную локальность местоположений пикселей.
С точки зрения удобства, самым быстрым способом получить что-то работает будет иметь цикл for
, который будет собирать все результаты вместе.
Что-то вроде этого:
ai1 = [3, 5, 7]; %// Example row coordinates
ai2 = [6, 8, 9]; %// Example column coordinates
%// Image defined by you
I= [200 219 226 228 228 240 243 245 245
212 222 229 233 241 247 248 252 252
220 226 234 239 247 250 250 255 253
225 231 244 248 249 248 247 253 250
233 238 251 252 254 249 242 242 235
243 250 255 246 250 244 230 216 200
252 255 250 231 225 211 187 166 153
250 249 234 213 192 164 129 111 114
236 226 195 168 138 119 93 84 91];
sigma = 3; %// Defined by you
out = zeros(size(I)); %// Define output image
%// Define 2D grid of points
[x1,x2] = ndgrid(1:size(I,1), 1:size(I,2));
for idx = 1 : numel(ai1) %// Or numel(ai2) as it's the same size
%// Compute internal function
p = 1 - exp(-(x1 - ai1(idx)).^2/(2*sigma^2)).*exp(-(x2 - ai2(idx)).^2/(2*sigma^2));
%// Accumulate
out = out + log(p);
end
%// Take anti-log
out = exp(out);
Имейте в виду, что выше обозначения относительно 1 индексации в MATLAB начинает индексировать вещи 1. Традиционно индексация изображения начинается с 0, так что если вы хотите начать с 0, просто смещение ai1
и ai2
1, а также в ndgrid
вызова, вычитать значения на 1.
Итак, изменения здесь:
ai1 = [3, 5, 7] - 1; %// Example row coordinates
ai2 = [6, 8, 9] - 1; %// Example column coordinates
... и здесь:
%// Define 2D grid of points
[x1,x2] = ndgrid(1:size(I,1), 1:size(I,2));
x1 = x1 - 1; x2 = x2 - 1;
Я предполагаю, что нулевой индексации является то, что необходимо.Таким образом, в описанной выше коде, я получаю это как выход:
out =
Columns 1 through 8
1.6849 1.1763 0.7129 0.3843 0.2042 0.1387 0.1508 0.2215
1.5092 0.9580 0.4959 0.2025 0.0633 0.0242 0.0372 0.0784
1.4192 0.8515 0.4004 0.1353 0.0236 0 0.0089 0.0249
1.4240 0.8534 0.4032 0.1427 0.0348 0.0084 0.0057 0.0056
1.5171 0.9519 0.4857 0.2003 0.0682 0.0208 0.0047 0
1.6802 1.1341 0.6418 0.3054 0.1241 0.0424 0.0110 0.0029
1.8866 1.3832 0.8733 0.4735 0.2227 0.0903 0.0304 0.0073
2.1040 1.6730 1.1773 0.7265 0.3965 0.1940 0.0855 0.0342
2.3020 1.9666 1.5312 1.0730 0.6811 0.4020 0.2315 0.1446
Column 9
0.3566
0.1563
0.0594
0.0180
0.0056
0.0036
0
0.0199
0.1250
Как вы можете видеть, строки и столбцы координата, что мы указали в ai1
и ai2
являются нулевого в матрице расстояний в то время как остальная часть точек отражает приблизительное расстояние от каждой из опорных точек. Это, честно говоря, выглядит как обводненная версия distance transform. Нулевые коэффициенты имеют смысл. Помните, что мы берем продукт всех матриц k
для окончательного вывода, и то, что должно произойти, состоит в том, что x1
и x2
, безусловно, будут иметь пару ai1
/ai2
, и поэтому вычитание в экспоненте приводит к 1 выходу , и 1 - 1 = 0
, а произведение чего-либо (кроме бесконечности) с 0 равно 0. Отсюда и причина, по которой там есть 0-й коэффициент!
Является ли каждая строка «Я» точкой? Вы посмотрели на 'pdist'? – Dan
Как указано * ai1 * и * ai2 *? – brodoll
@ Dan: Я думаю, что каждый пиксель является точкой. Brodroll: ai1 и ai2 - две координаты пикселя. Например, когда вы сказали, что пиксель a, который имеет позицию a1, является строкой, а a2 является столбцом – Jame