java - 在java中获取一组图像的平均图像

我有一套气象RGB类型BufferedImage。我想获得他们的平均形象。这样,我的意思是获取每个像素的平均值,并根据这些值制作一张新图像。我试过的是:

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:

enter image description here

输入2:

enter image description here

输出:

enter image description here

最佳答案

您需要颜色的每种成分的平均值,平均红色,平均绿色,平均蓝色。

相反,您是对整个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]);

本文翻译自 https://stackoverflow.com/questions/39851404/

网站遵循 CC BY-SA 4.0 协议,转载或引用请注明出处。

标签 java image-processing bufferedimage argb


相关文章:

java - 自定义checkstyle配置忽略标准规则?

java - 使用selectonemenu创建JSF数据表并从数据库填充其数据

python - OpenCV:隔离OCR的车牌字符

java - 比较RGB颜色,以便色差比强度和更显着

java - 如何用“。”从浮点数中生成字符串(点)作为小数点分隔符,且浮点后不超过3位?

java - 在JTextArea中选择文本不会显示任何选择颜色

image-processing - 支持向量机用于多对象分类

java - 在Java中为图像着色

java - 正在访问BufferedImage线程安全

java - BufferedImage颜色饱和度