【问题标题】:get average image of a set of images in java在java中获取一组图像的平均图像
【发布时间】:2016-10-04 11:42:31
【问题描述】:

我有一套气象RGB类型BufferedImages。我想得到他们的平均形象。我的意思是获取每个像素的平均值并用这些值制作新图像。我尝试的是这样的:

public void getWaveImage(BufferedImage input1, BufferedImage input2){
   // images are of same size that's why i'll use first one's width and height
   int width = input1.getWidth(), height = input1.getHeight();

   BufferedImage output = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);

   int[] rgb1 = input1.getRGB(0, 0, width, height, new int[width * height], 0, width);
   int[] rgb2 = input2.getRGB(0, 0, width, height, new int[width * height], 0, width);
   for(int i=0; i<width; i++){
      for(int j=0; j<height; j++){
         int rgbIndex = i * width + j;
         rgb1[rgbIndex] = (rgb1[rgbIndex] + rgb2[rgbIndex]) / 2;
      }
   }

   output.setRGB(0, 0, width, height, rgb1, 0, width);
   return output;
}

我做错了什么?提前谢谢你。

输入1:

输入2:

输出:

【问题讨论】:

  • 首先定义你所说的平均数...
  • 我不认为使用rgb1[rgbIndex] + rgb2[rgbIndex]) / 2 会给你两种输入颜色之间的颜色。
  • @Tschallacka 抱歉,我现在添加了。

标签: java image-processing bufferedimage argb


【解决方案1】:

您想要颜色的每个分量的平均值,平均红色、平均绿色、平均蓝色。

相反,您正在平均整个 int。

Color c1 = new Color(rgb1[rgbIndex]);
Color c2 = new Color(rgb2[rgbIndex]);
Color cA = new Color((c1.getRed()   + c2.getRed())/2,
                     (c1.getGreen() + c2.getGreen())/2,
                     (c1.getBlue()  + c2.getBlue())/2);
rgb1[rgbIndex] = cA.getRGB();

由于创建了这么多对象,这可能不是最有效的,所以更直接的方法是这样的:

public static int average(int argb1, int argb2){
   return (((argb1       & 0xFF) + (argb2       & 0xFF)) >> 1)       | //b
          (((argb1 >>  8 & 0xFF) + (argb2 >>  8 & 0xFF)) >> 1) << 8  | //g
          (((argb1 >> 16 & 0xFF) + (argb2 >> 16 & 0xFF)) >> 1) << 16 | //r
          (((argb1 >> 24 & 0xFF) + (argb2 >> 24 & 0xFF)) >> 1) << 24;  //a
}

用法:

rgb1[rgbIndex] = average(rgb1[rgbIndex], rgb2[rgbIndex]);

【讨论】:

    【解决方案2】:

    如果你有:

    int rgb1, rgb2; //the rgb value of a pixel in image 1 and 2 respectively
    

    “平均”颜色是:

    int r = (r(rgb1) + r(rgb2)) / 2;
    int g = (g(rgb1) + g(rgb2)) / 2;
    int b = (b(rgb1) + b(rgb2)) / 2;
    
    int rgb = ((r & 0xFF) << 16) | ((g & 0xFF) << 8) | ((b & 0xFF) << 0);
    

    使用以下“辅助”方法:

    private static int r(int rgb) { return (rgb >> 16) & 0xFF; }
    private static int g(int rgb) { return (rgb >> 8) & 0xFF; }
    private static int b(int rgb) { return (rgb >> 0) & 0xFF; }
    

    如果您不想处理按位运算,也可以使用 Color 类。

    【讨论】:

      【解决方案3】:

      另一种解决方案是替换

      rgb1[rgbIndex] = (rgb1[rgbIndex] + rgb2[rgbIndex]) / 2;
      

      rgb1[rgbIndex] = ((rgb1[rgbIndex]>>1)&0x7f7f7f7f)+((rgb2[rgbIndex]>>1)&0x7f7f7f7f)+(rgb1[rgbIndex]&rgb2[rgbIndex]&0x01010101);
      

      二进制右移除以2,和的最后一个成员处理两个奇数的情况。

      【讨论】:

      • 不错的小玩意儿!
      猜你喜欢
      • 2018-06-08
      • 1970-01-01
      • 2015-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-02
      • 2017-05-11
      相关资源
      最近更新 更多