Java - 这段代码的解释是什么?

时间:2014-03-24 10:24:14

标签: java image

我有以下代码:

for (int i = 0; i < height1; i++) {
  for (int j = 0; j < width1; j++) {
    int rgb1 = img1.getRGB(i, j);
    int rgb2 = img2.getRGB(i, j);
    int r1 = (rgb1 >> 16) & 0xff;
    int g1 = (rgb1 >>  8) & 0xff;
    int b1 = (rgb1      ) & 0xff;
    int r2 = (rgb2 >> 16) & 0xff;
    int g2 = (rgb2 >>  8) & 0xff;
    int b2 = (rgb2      ) & 0xff;
    diff += Math.abs(r1 - r2);
    diff += Math.abs(g1 - g2);
    diff += Math.abs(b1 - b2);
  }
}
double n = width1 * height1 * 3;
double p = diff / n / 255.0;
System.out.println("diff percent: " + (p * 100.0));

代码用于查找图像之间的差异百分比,但我不知道为什么百分比除以“n”和“255.0”

谢谢

5 个答案:

答案 0 :(得分:1)

问问自己,如果没有,会发生什么? 它只取决于单位的百分比,百分比是多少?每像素RGB单位? 关于255,每种颜色有一个字节:所以8位,8的2次幂是256意味着0到255 =每种颜色分量256种可能性。

答案 1 :(得分:1)

每个像素由3个颜色分量组成:

  • R - 红色成分
  • G - 绿色成分
  • B - 蓝色成分

这些颜色分量中的每一个都表示为单个字节 - 即8位。可以用字节表示的最大值是255.

因此,为了计算百分比的差异,您可以计算所有像素的所有颜色分量的差异总和,并除以此总和...

  • 乘以像素数,以获得每像素的平均差异
  • 乘以3,以获得每个颜色成分的平均差异
  • 乘以255,以获得介于0.0和1.0之间的值,该值可以转换为百分比值

答案 2 :(得分:0)

n次255是可能的最大差异。也就是说,如果所有颜色的差异为255.diff是实际差异。要获得百分比,您必须将实际除以总数并乘以100.0

顺便说一下:

diff / n / 255 = diff / (n * 255)

答案 3 :(得分:0)

它用于24位颜色深度和图片大小的标准化目的。循环中的迭代将精确地运行n / 3次,并且在每次迭代中,diff将增加3个数字,范围为[0-255]。

答案 4 :(得分:0)

看起来diff变量保存图像所有像素(宽度*高度)的所有颜色(红色+绿色+蓝色)的总和。

所以:

double n = width1 * height1 * 3;

保存信息您添加每个像素的颜色差异的次数。 RGB的颜色值介于0到255之间。

p变量范围介于0和1之间,因此必须将diff除以n和255。

然后在输出时,你只需将p乘以100得到百分比。