【问题标题】:Multiplying each pixel by scale factor将每个像素乘以比例因子
【发布时间】:2014-11-07 22:48:37
【问题描述】:
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;
            }
        }
    }
}

所以这个函数应该将图像中的每个像素乘以一个比例因子。但由于某种原因,它不起作用。我找不到它有什么问题。有人能帮我解决吗?

【问题讨论】:

  • 我不确定这是否符合您的想法。无论 y 多大,array[x] 都将继续增加,并且每个 array[y] 值将在 x 的每次迭代中继续增加。这应该是一个二维数组吗?因为不是。

标签: c function pixels multiplication


【解决方案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 到 max(cols, rows)。显然,您的像素数组具有比这更多的像素,可能是 (cols * rows) 像素,因此您的算法忽略了大多数像素,但对某些像素应用了很多次,这基本上就是它不起作用的原因。

【讨论】:

  • 我推测在两个循环结束时,他有一个等于 255 的值数组,具体取决于比例因子。
【解决方案2】:

考虑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] &gt;= 255) array[x] = 255;。因为它使用无符号 8 位整数(只能存储 0 到 255 范围内的值);只有当array[x] 包含值 255 时,(array[x] &gt;= 255) 才有可能为真。它相当于if(array[x] == 255) array[x] = 255;,实际上什么都不做。您的 if (array[x] &gt;= 255 &amp;&amp; array[y] &gt;= 255) { 代码也有同样的问题 - 它什么也不做。

现在阅读 Asik 的回答 - 他也是对的。您在每个像素上多次执行相同的错误计算;它最终会有点像一个伪随机数生成器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-20
    • 1970-01-01
    相关资源
    最近更新 更多