在Java中计算两个图像直方图之间的卡方距离



我用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索引

最新更新