【问题标题】:Inconsistent results from taking average of two RGB values取两个 RGB 值的平均值导致的结果不一致
【发布时间】:2017-09-22 12:30:20
【问题描述】:

为什么这些像素 rgb 值有时相等有时不相等?我正在学习图像处理。如果有人在这里帮助我,那就太好了。

public class ColorTest1 {

    Color p1;
    Color p2;

    ColorTest1() throws IOException, InterruptedException {
        BufferedImage bi = ImageIO.read(new File("d:\\x.jpg"));
        for (int y = 0; y < bi.getHeight(); y++) {
            for (int x = 0; x < bi.getWidth() - 1; x++) {
                p1 = new Color(bi.getRGB(x, y));
                p2 = new Color(bi.getRGB(x + 1, y));

                int a = (p1.getAlpha() + p2.getAlpha()) / 2;
                int r = (p1.getRed() + p2.getRed()) / 2;
                int g = (p1.getGreen() + p2.getGreen()) / 2;
                int b = (p1.getBlue() + p2.getBlue()) / 2;

                int x1 = p1.getRGB();
                int x2 = p2.getRGB();

                int sum1 = (x1 + x2) / 2;

                int sum2 = a * 16777216 + r * 65536 + g * 256 + b;
                System.out.println(sum1 == sum2);
            }
        }
    }

    public static void main(String... areg) throws IOException, InterruptedException {
        new ColorTest1();
    }
}

这是图片:

【问题讨论】:

  • 不应该期望(x1 + x2) / 2 能正常工作。它完全忽略了渠道。您可以使用(a &amp; b) + (((a ^ b) &amp; 0xFEFEFEFE) &gt;&gt;&gt; 1) 平均两种颜色(忽略 alpha 通道的语义)
  • 没有得到它。你能告诉我简单的方法,这样我就可以理解了。不过没有开玩笑。
  • 为什么 sum1=(x1 + x2) / 2 和 sum2 不相等。但有时 sum1 和 sum2 相等
  • 没有什么真正有趣的事情发生,当他们相等时,基本上是运气。为了比较,您可能会问为什么有时您可以通过简单地添加数字来添加两个数字,但并非总是如此。唯一的区别是进位,这里既有通道间进位(不应该发生),/2 也会造成一些麻烦。
  • 你一直在问这种关于颜色的问题,是的,一般来说你必须关心某物是一种颜色,而不是“只是任何int”,他们不要以同样的方式工作。

标签: java image-processing rgb rgba


【解决方案1】:

取两个像素。一个是黑色的。另一个几乎是黑色的,但有一点点红色,只有 1/255。忽略阿尔法。 r 将是 (0 + 1) / 2 = 0。gb 也将是 0。 x1 将是 0。x2 将是 65536,对吗?所以sum1 将是 65536 / 2 = 32768。sum2 显然会是 0。

每当两种颜色的红色或绿色之和为奇数时,int 除法将设置 RGB 中下一种颜色的高位,导致意外结果。

【讨论】:

  • 感谢。我明白了。
  • 那是在边界上。在我为自己辩护之前,我必须稍微改进一下这个问题。 :-) @NEKIBURRAHMAN
猜你喜欢
  • 2016-01-24
  • 2015-03-16
  • 1970-01-01
  • 1970-01-01
  • 2017-08-22
  • 1970-01-01
  • 2016-10-09
  • 2021-03-24
  • 1970-01-01
相关资源
最近更新 更多