void scale_brightness( uint8_t array[],
unsigned int cols,
unsigned int rows,
double scale_factor )
{
for (int x = 0; x < rows; x++)
{
for (int y = 0; y < cols; y++)
{
array[x] = ceil(scale_factor * array[x]);
array[y] = ceil(scale_factor * array[y]);
if (array[x] >= 255 && array[y] >= 255)
{
array[x] = 255;
array[y] = 255;
}
}
}
}
因此,该函数应该将图像中的每个像素乘以比例因子。但由于某种原因,它不起作用。我找不到它的错误。有人能帮助我吗?
答案 0 :(得分:1)
只需在纸上展开循环,您就会看到正在发生的事情......
第一次迭代(x = 0,y = 0)
array[0] = ceil(scale_factor * array[0]);
array[0] = ceil(scale_factor * array[0]);
if (array[0] >= 255 && array[0] >= 255)
{
array[0] = 255;
array[0] = 255;
}
这已经是荒谬的,你在同一个元素上进行两次相同的操作,然后你的if语句在同一个元素上检查两次相同的条件,然后将255分配给相同的值两次。
第二次迭代(x = 0,y = 1)
array[0] = ceil(scale_factor * array[0]);
array[1] = ceil(scale_factor * array[1]);
if (array[0] >= 255 && array[1] >= 255)
{
array[0] = 255;
array[1] = 255;
}
所以现在你再次设置元素0,即使你刚刚在最后一次迭代中做到了,但至少我们现在正在考虑元素1。
通过外推,我们可以看到计算将应用于像素0到最大(cols,rows)。显然,你的像素数组的像素数多得多,可能是(cols * rows)像素,因此你的算法会忽略大多数像素,但对于某些像素会被多次应用,这就是它无法正常工作的原因。
答案 1 :(得分:0)
考虑array[x] = ceil(scale_factor * array[x]);
。如果array[x]
为255而scale_factor
为1.1,那么就像array[x] = 281;
。这是一个溢出(281太大而不适合无符号的8位整数)。 C将丢弃不适合的最高位,因此它就像array[x] = 25;
。
现在考虑if(array[x] >= 255) array[x] = 255;
。因为它使用无符号8位整数(只能存储0到255范围内的值);当(array[x] >= 255)
包含值255时,array[x]
才有效。它等同于if(array[x] == 255) array[x] = 255;
,它实际上什么都不做。您的if (array[x] >= 255 && array[y] >= 255) {
代码存在同样的问题 - 它什么都不做。
现在阅读Asik的回答 - 他也是对的。你在每个像素上多次进行相同的破碎计算;它最终有点像伪随机数生成器。