2

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

它可以工作,有点;我在结果中有一些颜色不稳定。

图片

左边是原图,右边是经过上述方法处理的。我终其一生都无法弄清楚为什么这些颜色很奇怪。

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

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

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

4

4 回答 4

2

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

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

于 2013-11-05T18:16:05.503 回答
2

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

b 用于颜色和迭代?

于 2013-11-05T18:17:31.960 回答
2

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

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

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

只要确保你r,g,b在打电话后重置为零setColor(),它应该没问题。

于 2013-11-05T18:21:04.600 回答
0

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

long unsigned int r,g,b;

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

于 2013-11-05T18:12:03.917 回答