如何计算设定点的距离

How to compute the distance of a set points

我在计算点的距离时遇到了问题。让我们看看我的定义。我有一个有限的设定点:

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

其中 Ω 是图像域,i 是像素索引。

距离函数d由参数sigma调整,允许根据要拟合的点数进行调整:

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]

现在,我想用给定的 sigma=3 计算距离 d,我想计算遵循上述等式的距离 d。你能帮我用matlab代码实现吗?提前谢谢你。

如果我对等式的解释正确,那么你有 k row/column 坐标。对于每对 row/column 坐标,您有 ai1,ai2,您希望计算 post 中表达式括号内的项。这导致 k 矩阵,然后你将得到一个矩阵 d,它与你的图像大小相同,它计算所有的 product这些矩阵在一起。

但是,为了数值稳定性,如果你取对数和,将各项相加,然后取结果的指数,你会得到同样的结果,而且实际上要快得多(帽子尖给 Nikos M. 小费)。

我想指出 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-indexing 的,因为 MATLAB 从 1 开始索引。传统上,图像索引从 0 开始,所以如果你想从 0 开始,只需将 ai1ai2 偏移 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

可以看到,我们在ai1ai2中指定的行和列坐标在距离矩阵中是,而其余的这些点的数量反映了距每个锚点的粗略距离。老实说,它看起来像是 distance transform 的淡化版本。零系数非常有意义。请记住,我们将所有 k 矩阵的乘积一起作为最终输出,将会发生的是 x1x2 肯定会有 ai1 / ai2 对,因此指数中的减法会导致 1 输出,而 1 - 1 = 0 和任何东西(无穷大除外)与 0 的乘积是 0.... 因此有的原因那里的系数为 0!