改善直方图

时间:2017-04-04 13:38:02

标签: java image-processing histogram grayscale

我已经制作了这个方法来获取图像的像素值,我使用它来比较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;
 }

1 个答案:

答案 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类直方图没有意义,但可能会帮助你加快速度。 我只是使用位掩码从该整数中获取红色,绿色和蓝色值并创建三个直方图。