【问题标题】:Averaging four pixels of image yields wonky colors平均四个像素的图像会产生不稳定的颜色
【发布时间】:2013-11-16 17:15:36
【问题描述】:

我有一个指定高度和宽度的图像要缩小 1/4。我这样做的方法是取 4 个像素(例如,(0,0),(1,0),(0,1),(1,1)),获取每个像素的 RGB 值,然后取平均值RGB 值并将其作为一个像素注入新图像(因此前面提到的这四个像素坐标将成为新图像的 (0,0))。

它工作,有点;我在结果中有一些颜色偏差。

左边是原图,右边是经过上述方法处理的。我这辈子都想不通为什么颜色很奇怪。

对于它的价值,我正在使用以下方法:

getPixel();
getColor();
setColor();

RGB 值分别通过getRed() 等获取。这些值以整数形式存储。

【问题讨论】:

  • 如果您执行r = r + 0.25*color.getRed() 之类的操作而不是稍后进行平均,会发生什么情况?您可能会遇到整数溢出(即:总和如此之大以至于大于整数可以容纳的最大值,并且它溢出为负数或从零重新开始)或整数饱和(即:语言检测到您将发生整数溢出,因此任何进一步的添加只会产生相同的值)。这种方法效率稍低,因为您在每个循环中进行更多的划分,但它更安全。
  • r,gb 是如何声明的?
  • 不过,整数的范围应该远远超过 1024。不过,对于@Dogbert 的价值;我试过r = r + 0.25*color.getRed() 和绿色和蓝色等价物,我的输出是彩虹静态噪声的美妙画布。
  • 这是什么 API? java.awt.Color 将使用 getRed/getBlue/getGreen 方法返回 0 - 255 范围内的 RGB 值。不会溢出。

标签: java image-processing colors


【解决方案1】:

在哪里重置变量 r、g、b?

b 用于颜色和迭代?

【讨论】:

  • 很好,但幸运的是,上面不是我正在使用的代码,只是重写了。在我的实际代码中,我根本不使用 b,我使用其他变量。不过,我确实修复了 OP 中的代码。这个错误很愚蠢。我忘了重置 RBG 值。干杯!
【解决方案2】:

看起来像溢出。 R、G 和 B 是什么数据类型?如果它们是 8 位无符号的,则在添加和移位之前转换为 16 位无符号。平均值会出现在适当的范围内,因为平均值不能超过给定的最小值到最大值的范围,但中间和很容易做到这一点。

如果您不介意处理速度较慢,请转换为浮点数,加并除以 4,然后再转换回来。可以做更多的数学运算,例如对数,双曲正切(我的最爱)等。但是您的问题并不表明需要这些东西。然而,当数学变得繁重时,它几乎是通用的治疗方法。

【讨论】:

    【解决方案3】:

    您永远不会在循环中重置 r,g,b,因此下一个像素没有获得正确的值(在 any 情况下)。它将四个像素添加到最后一个像素结果中,然后除以 4。

    由于将五个数字加在一起,您的颜色值会逐渐上升。例如,如果前一个像素的红色值是240,接下来的四个是220,220,220,220,那么即使所有四个像素都是220,你也会得到280 的“平均值”。然后下一个像素会更乱,等等。

    这就是为什么您会出现“蠕变”溢出的原因。当一个超过 255 时,当数字与setColor() 组合在一起时,您会溢出。您可以清楚地看到每个字节溢出的位置。首先是红色(在青色区域),然后是黄色(在深蓝色区域)。

    只要确保在调用setColor() 后将r,g,b 重置为零,就可以了。

    【讨论】:

    • 干杯,就是这样。你和乔尔救了罗素·克劳。
    【解决方案4】:

    只需将 r,g,b 声明为 long 无符号整数。

    long unsigned int r,g,b;
    

    在颜色可能为 (255,0,0) 且格式为 RGBA 的地方。 R 组件被移位 24 位以用完最高有效的 8 位。即使将它乘以 2 也可能导致无符号 32 位 int 溢出。使用 64 位(有符号或无符号)可以解决这个问题

    【讨论】:

    • 详细说明,这个答案表明您的问题是数字溢出。当您添加时,您的总和将返回负值。将 r,g,b 值声明为 long 可为您提供更高的上限,从而防止数字溢出。但是,将 r,g,b 声明为 int 而不是 long 可以正常工作。
    猜你喜欢
    • 2012-07-28
    • 2015-06-05
    • 2019-07-24
    • 2017-02-19
    • 2019-04-08
    • 1970-01-01
    • 2019-08-01
    • 2018-08-16
    • 2021-06-04
    相关资源
    最近更新 更多