用于调整画布上的亮度/对比度的公式?
image-processing
5
0

就像有一个将图像转换为灰度的公式一样,是否有一个公式可以增加图像的亮度并将其降低到相同水平?我尝试为每个r,g和b像素添加一个值。它的确会增加亮度,但是当我减小相同的值时,我不会恢复原来的值。

var pixels = context.getImageData(...);

//loop over the pixel data and add a value
p[i] = p[i]+100;
p[i+1] = p[i+1]+100;
p[i+2] = p[i+2]+100;

这会使图像变亮。但是,当我从每个像素减少100时,我就不会恢复原始图像。

我在网上看到,有一些公式可以正确计算出该值。有人可以解释吗?以及类似的对比度和伽玛?

更新:

谢谢大家的建议。在浏览以下一些帖子后,我尝试了此操作。

为了增加亮度:

var pixels = context.getImageData(...);

//loop over the pixel data and add a value
p[i] = p[i]+100 < 255 ? p[i]+100 : 255;
p[i+1] = p[i+1]+100 < 255 ? p[i+1]+100 : 255;
p[i+2] = p[i+2]+100 < 255 ? p[i+2]+100 : 255;

为了降低亮度:

var pixels = context.getImageData(...);

//loop over the pixel data and add a value
p[i] = p[i]-100 >= 0 ? p[i]-100 : 0;
p[i+1] = p[i+1]-100 >= 0 ? p[i+1]-100 : 0;
p[i+2] = p[i+2]+100 >= 0 ? p[i+2]-100 : 0;

我可以看到增量效果很好,但是当我递减时,仍然看不到原始图像,原始图像和加亮图像之间有一些差异!

我究竟做错了什么?

参考资料:
Stack Overflow
收藏
评论
共 2 个回答
高赞 时间 活跃

在Google上进行的快速搜索显示:

使用C ++调整位图图像的亮度/对比度

链接:

http://www.kweii.com/site/color_theory/2007_LV/BrightnessCalculation.pdf

http://www.bobpowell.net/image_contrast.htm

记住在发布一个之前要寻找类似的问题:)。

编辑:

另外两个链接:

图像处理算法第5部分:对比度调整:

http://thecryptmag.com/Online/56/imgproc_5.html

图像处理算法第4部分:亮度调整:

http://www.dfstudios.co.uk/articles/image-processing-algorithms-part-4/

编辑:

您发布的第二段代码中有错误:

var pixels = context.getImageData(...);

//loop over the pixel data and add a value
p[i] = p[i]-100 >= 0 ? p[i]-100 : 0;
p[i+1] = p[i+1]-100 >= 0 ? p[i+1]-100 : 0;
p[i+2] = p[i+2]+100 >= 0 ? p[i+2]-100 : 0; // <- Tha p[i+2]+100 should be a p[i+2]-100 right?

约翰内斯·詹德西Johannes Jendersie)说的是真的,您的问题是:

唯恐您有一个具有此值的像素

R = 100;
G = 210;
B = 20;

每种颜色加100,现在有:

R = 200;
G = 255; // It was 310 but you have to clamp it to 255.
B = 120;

现在您减去相同的100:

R = 100; // same
G = 155; // different!, this have to be 210!!
B = 20;  // same

这就是为什么此操作不可逆的原因。您可以做的就是始终保留原始图像的副本,并且每次更改该值时,都会重新应用亮度校正。

因此,取消加100的操作的方法不是减去100,而是将亮度校正值设置为0。这是多少个图像编辑程序可以工作的,您有一个滑块,而当您在滑块窗口中更改该值时,可以如果将原始图像设置为0,则始终会得到原始图像,但是一旦“应用”校正,就无法撤消,当您重新打开滑块窗口时,“ 0”现在是先前过滤的图像。

因此,您可以保留图像的备份和某个地方的BrightnesCorrection值,并且每次更改该值时,都需要在图像上重新应用校正,或者只需要接受以下事实即可恢复:图像恢复到以前的荣耀xD(至少没有这种亮度校正,不确定是否有更好的方法)。

希望能帮助到你。

收藏
评论

由于舍入和取整值,对图像的许多操作都是不可逆的。

您的每个颜色通道p[i]可能是字节类型?如果是这样,则只能存储0到255之间的值。例如,如果将100加到223,最终将以323结尾,则不能将其保存在1个字节中。这将导致溢出到67或被限制为255(最大可能数)。减去100将不会恢复223,但会导致155。

与其添加偏移量,不如尝试增加颜色。但这涵盖在AngelCastillo的答案中。 (那里您也会丢失信息,但是结果更好)


对更新的反应

我的意思是,钳位值(例如,您的实际实现)会导致数据丢失。就像上面的示例一样,太大的值将变为255。因此,再次减去100会将所有颜色设置为155,原始颜色为155 或更大 。较亮的颜色(> 155)的信息会丢失。

在其他情况下(对比度和伽玛值更改),您也会丢失信息,因为四舍五入会将先前的不同颜色设置为相同的值。

避免这种情况的唯一方法是使用其他格式的每个通道更多的信息。例如> 16位有符号int或浮点数。我怀疑您的画布是否可以执行此操作,因此您需要保存自己的背景副本(具有较高的值范围)。对您的副本进行所有转换,只显示固定在画布上的图像。

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号