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;
}
}
}
}
所以这个函数应该将图像中的每个像素乘以比例因子。但由于某种原因,它不起作用。我找不到它有什么问题。有人可以帮我解决这个问题吗?
最佳答案
只需展开纸上的环,您就会看到发生了什么......
第一次迭代(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)。显然,您的像素数组具有比这更多的像素,可能是(列*行)像素,因此您的算法忽略了大多数像素,但对某些像素应用了多次,这基本上就是它不起作用的原因。
关于c - 将每个像素乘以比例因子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26811396/