2015-05-26 5 views
0

У меня проблема с вычислением расстояния точек. Посмотрим на мое определение. У меня есть конечное множество точек:Как вычислить расстояние заданных значений

S={a_i=(a_i1,a_i2) ∈ Ω, 1<=i<=k }

где Ω является доменом образа, i является индекс пикселя.

Функция расстояние d настраивается параметром сигмы, что позволяет регулировать в соответствии с количеством точек, которые будут установлены: enter image description here

Пусть I:Ω->R дается

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] 

Теперь, я хочу, чтобы вычислить расстояние d с заданным sigma=3, я хочу вычислить расстояние d, которое следует приведенному выше уравнению. Не могли бы вы помочь мне реализовать его по коду matlab? Заранее спасибо.

+0

Является ли каждая строка «Я» точкой? Вы посмотрели на 'pdist'? – Dan

+1

Как указано * ai1 * и * ai2 *? – brodoll

+0

@ Dan: Я думаю, что каждый пиксель является точкой. Brodroll: ai1 и ai2 - две координаты пикселя. Например, когда вы сказали, что пиксель a, который имеет позицию a1, является строкой, а a2 является столбцом – Jame

ответ

2

Если я интерпретирую уравнение справа, у вас есть координаты строки/столбца 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-й коэффициент!

+0

Благодарим вас за разъяснения. Теперь я понимаю, в чем смысл формулы. Однако вы устанавливаете фиксированное положение a_i1 и a_i2. Как вычислить для всего изображения, что означает, что a_i1 и a_i2 будут перемещать все изображения. То, что я думаю – Jame

+1

Ну, 'a_i1' и' a_i2', вероятно, определяются как точки, относящиеся к контуру. Это дается вами или алгоритмом генерации контуров. У меня недостаточно информации о вашей проблеме, чтобы дать вам больше. – rayryeng

+1

Хорошо. Вижу. Просто вычислите расстояние во всех точках контура. Я могу это сделать – Jame

Смежные вопросы