我用Java计算了两个图像的直方图(代码修改并缩短):
for (int posX = 0; posX < image.getWidth(); posX++)
{
for (int posY = 0; posY < image.getHeight(); posY++)
{
Color c1 = new Color(image.getRGB(posX, posY));
cummulative[0] = cummulative[0] + c1.getRed();
cummulative[1] = cummulative[1] + c1.getGreen();
cummulative[2] = cummulative[2] + c1.getBlue();
numPixels++;
}
}
r1 = cummulative[0] / numPixels;
g1 = cummulative[1] / numPixels;
b1 = cummulative[2] / numPixels;
,然后计算直方图的欧氏距离:
tempDist = Math.sqrt((r1 - r2) * (r1 - r2) + (g1 - g2) * (g1 - g2) + (b1 - b2) * (b1 - b2));
现在我想计算卡方距离而不是欧几里得距离。但我不知道如何实现它。有人能介绍一下吗?
编辑:我现在有下面的代码来生成直方图:float[] histogram = new float[256];
for (int i = 0; i < input.getWidth(); i++) {
for (int j = 0; j < input.getHeight(); j++) {
int color = 0;
switch (colorVal) {
case 1:
color = new Color(input.getRGB(i, j)).getRed();
break;
case 2:
color = new Color(input.getRGB(i, j)).getGreen();
break;
case 3:
color = new Color(input.getRGB(i, j)).getBlue();
break;
}
histogram[color]++;
}
}
假设我有以下数据,我该如何继续:
图像1:R 10 count 1000
R 20 count 100
R 30 count 100
G 20 count 600
G 255 count 600
B 0 count 800
B 200 count 400
图2:
R 10 count 1000
R 20 count 200
G 20 count 600
G 255 count 600
B 0 count 800
B 100 count 200
B 200 count 200
你只是总结了r,g,b的值,而没有计算直方图。首先,正确计算直方图,然后卡平方距离可以计算为d(x,y) = sum((xi-yi)^2/(xi+yi))/2,其中x和y是你的直方图,i是直方图的bin索引