所以我得到了一个“相似性度量”,但没有信息。相似性度量称为欧氏距离平方,或平方距离的总和,我有这个公式:
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,这是否有意义?
已获取更多信息。
答案 0 :(得分:7)
该代码正确计算欧几里德分离的平方。
据推测,这是一个很小的数字,因为样本值的幅度很小。绝对没有理由不期待这样的价值。只有你能知道实际价值意味着什么以及应该用它做什么。
作为一种风格问题,我希望变量在其生命周期中保持相同的逻辑值。在这段代码中,你写了ssd = 1/ssd
,它会略微加工。您使用ssd来表示 s um s quared d istances,但是当您编写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;
}