平均四个像素的图像产生不稳定的颜色

时间:2013-11-05 18:00:15

标签: java image-processing colors

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

它有效;我在结果中得到了一些颜色的好感。

image

左边是原始图像,右边是通过上面的方法处理。我不能为我的生活弄清楚为什么颜色会变得棘手。

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

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

RGB值通过getRed()等单独获取。这些值存储为整数。

4 个答案:

答案 0 :(得分:2)

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

如果你不介意慢速处理,转换为浮点数,加4除以4,然后转换回来。可以完成更多的数学运算,例如对数,双曲线切线(我最喜欢的)等。但是你的问题并不表示需要这样的东西。然而,当数学变得沉重时,这几乎是通用的解决方案。

答案 1 :(得分:2)

你在哪里重置变量r,g,b?

b既用于颜色又用于迭代?

答案 2 :(得分:2)

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

由于有五个数字加在一起,你的颜色值会逐渐增加。例如,如果前一个像素红色值为240,接下来的四个为220,220,220,220,那么即使所有四个像素都为280,您的“平均值”也会为220 }。然后,下一个像素进一步混乱,等等。

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

请在致电r,g,b后确保将setColor()重置为零,并且应该没问题。

答案 3 :(得分:0)

只需将r,g,b声明为 long unsigned int。

long unsigned int r,g,b;

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