将每个像素乘以比例因子

时间:2014-11-07 22:48:37

标签: c function pixels multiplying

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;
            }
        }
    }
}

因此,该函数应该将图像中的每个像素乘以比例因子。但由于某种原因,它不起作用。我找不到它的错误。有人能帮助我吗?

2 个答案:

答案 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的回答 - 他也是对的。你在每个像素上多次进行相同的破碎计算;它最终有点像伪随机数生成器。