如何计算设定点的距离

时间:2015-05-26 14:42:55

标签: matlab image-processing

我有一个关于计算点距离的问题。让我看看我的定义。我有一个有限的设定点:

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

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

距离函数d由参数sigma调整,允许根据要拟合的点数进行调整: 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]

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

1 个答案:

答案 0 :(得分:2)

如果我正确解释等式,你有k行/列坐标。对于ai1,ai2的每对行/列坐标,您希望计算帖子中表达式括号内的术语。这会产生k矩阵,然后您将得到一个矩阵d,使其与图像的大小相同,并且它会计算所有这些矩阵的产品

然而,对于数值稳定性,如果你取对数和,加上项,然后取结果的指数,你会得到同样的东西,它实际上要快得多(帽子的顶端是尼克斯) 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系数!