我已经制作了这个方法来获取图像的像素值,我使用它来比较1个图像和50个其他图像。然而,产生输出需要永远。有谁知道我可以加快这种方法的方法?将图像转换为灰度是否会更快?如果有人可以帮助代码,那就太棒了!
public static double[] GetHistogram (BufferedImage img) {
double[] myHistogram = new double [16777216];
for (int y = 0; y < img.getHeight(); y += 1)
{
for (int x = 0; x < img.getWidth(); x += 1)
{
int clr = img.getRGB(x,y);
Color c = new Color(img.getRGB(x, y));
int pixelIntValue = (int) c.getBlue() * 65536 + c.getGreen() * 256 + c.getRed();
myHistogram[pixelIntValue]++;
}
}
return myHistogram;
}
答案 0 :(得分:0)
使用16777216类计算直方图非常不寻常。 大多数直方图是针对每个通道单独计算的,分别为R,G和B生成256级直方图。如果将图像转换为灰度,则只有一个。
我不是Java专家。我不知道编译器如何聪明地优化代码。 但是你为每一行调用img.getHeight(),为图像的每一列调用img.getWidth()。 我不知道这些表达式实际评估的频率,但如果您只使用2个变量来分配图像的宽度和高度,则可以节省一些处理时间,以便开始循环。
您还可以为每个像素调用img.getRGB(x,y)两次。相同的故事。也许只做一次就更快。函数调用通常比从内存中读取变量要慢。
你也应该考虑一下你在这做什么。 img.getRGB(x,y)为您提供颜色的整数表示。 然后你将这个整数放入一个控制器中,从中制作一个Color对象。然后使用c.getBlue()等来获取该Color对象的红色,绿色和蓝色的整数值。只是把它组合成一个整数?
你可以直接使用getRGB的返回值,至少可以保存4个函数调用,3次乘法,3次求和......
所以再次考虑到我最近一次编程Java就像10年前一样,我的功能看起来更像是:
public static double[] GetHistogram (BufferedImage img) {
double[] myHistogram = new double [16777216];
int width = img.getWidth()
int height = img.getHeight()
for (int y = 0; y < height; y += 1)
{
for (int x = 0; x < width; x += 1)
{
int clr = img.getRGB(x,y);
myHistogram[clr]++;
}
}
return myHistogram;
}
当然,阵列类型和大小不会是正确的,整个16777216类直方图没有意义,但可能会帮助你加快速度。 我只是使用位掩码从该整数中获取红色,绿色和蓝色值并创建三个直方图。