2011-11-24 190 views
0

所以我给了一个“相似性度量”来使用,但没有任何信息。该相似性度量被称为欧几里得距离的平方,或平方距离的总和,并且我有这样一个公式:什么是欧几里得距离平方或距离平方和?

D2 = Σ(I(x,y) – I’(x,y))^2 

维基百科告诉我:

d(p,q) = (p1 − q1)^2 + (p2 − q2)^2 + ... + (pi − qi)^2 + ... + (pn − qn)^2 

我有个立体图像对,该是同一主题的两个图像,一个来自左眼视图,一个来自右眼视图。我可以从左侧和右侧图片中的相应坐标中提取像素信息:

private double euclidDistSquared(BufferedImage leftRegion, BufferedImage rightRegion) { 
    double temp = 0; 
    double ssd = 0; 
    Raster left = leftRegion.getData(); 
    Raster right = rightRegion.getData(); 

    for(int x = 0; x < leftRegion.getWidth(); x++) { 
     for(int y = 0; y < leftRegion.getHeight(); y++) { 
      temp = left.getSampleDouble(x,y,0) - right.getSampleDouble(x,y,0); 
      temp *= temp; 
      ssd += temp; 
     } 
    } 
    ssd = 1/ssd; 
    return ssd; 
} 

我以后做的是正确的吗?第一个温度线是相应坐标上像素值的提取和减去,但是我在网上看到的一些内容表明我想分别减去我的x和y值(我怎么会这样做? !)。而且,我最终得到的ssd值是非常小的,例如3.792346286724133E-6,这是否有意义?

编辑了解更多信息。

+1

如何可以在许多可笑? –

回答

7

该代码正确计算欧几里得分离的平方。

大概是小数字,因为样本值很小。绝对没有理由不期望这样的价值。只有你可以知道实际价值的含义以及应该如何处理。


作为一个风格问题,我宁愿让变量在其整个生命周期中保持相同的逻辑值。在这段代码中,你写了ssd = 1/ssd,它略微磨光。您正在使用ssd来表示s um s quared d登录,但是当您编写1/ssd时,这不再是距离的平方和,而是相似性度量。

我会写这样的:

private double similarityMeasure(BufferedImage leftRegion, BufferedImage rightRegion) { 
    double ssd = 0; 
    Raster left = leftRegion.getData(); 
    Raster right = rightRegion.getData(); 

    for(int x = 0; x < leftRegion.getWidth(); x++) { 
     for(int y = 0; y < leftRegion.getHeight(); y++) { 
      double diff = left.getSampleDouble(x,y,0) - right.getSampleDouble(x,y,0); 
      ssd += diff*diff; 
     } 
    } 
    return 1/ssd; 
}