使用标准图像处理算法应用 Photoshop 的“阴影/高光”校正

信息处理 图像处理 自适应算法
2021-12-26 03:25:13

Adobe 的 Photoshop 有一个称为“阴影/高光”的出色过滤器,用于在一个步骤中校正照片的黑暗区域和过度曝光区域。通过简单的分析,我认为它使用了一些与半径相关的自适应对比度算法(光晕效应是典型的),可能与插值相结合(即使是超暗或额外/白色,使用此过滤器的裁剪区域也会得到很大改善。

使用的参数可以在下面的对话框中看到

在此处输入图像描述

我要寻找的是一种仅从对话框中给出的参数值开始的方法,“盲目”应用一系列参数化操作,并以非交互方式获取结果(好吧,也许在调整参数时预览图像某些 GUI 环境中的滑块)。

关于如何使用标准的、众所周知的图像处理算法执行此操作的任何建议?

3个回答

我认为这可以通过直方图拉伸来实现。输入像素值(级别)使用线性变换从<minin,maxin><minout,maxout>. 输入和输出像素值的强度变换如下所示:

Iout=Iinmininmaxinminin(maxoutminout)+minout

公式可以更简单,但这个更清晰,就是将输入值从一个区间转换到另一个区间。

默认,min为 0 并且max是 255(取决于位深度)。增加价值minin强调阴影,同时减少max强调灯光。

还有“半径”轨迹条,所以我想直方图操作可以自适应/本地完成,即在每个像素而不是整个图像上计算一个窗口的直方图。

当窗口很小以避免急剧过渡时,在直方图计算之前对工作图像进行高斯模糊可能很方便。

同样,您可以计算平滑然后应用的差异图。

调整可能会干扰色彩平衡,因此仅适用于亮度通道或计算灰度值调整并适用于 R、G 和 B 通道就足够了。

这个 Mathematica 代码用“gamma”操作代替 Photoshop 的“Amount”参数控制,但它实现了大致相同的结果。

Manipulate[
    Module[{
        i1 = GaussianFilter[Binarize[img, {0, t1}], r1],
        i2 = GaussianFilter[Binarize[img, {1 - t2, 1}], r2]},
        (i1*img^g1 + img*(1 - i1))/2 + (i2*img^g2 + img*(1 - i2))/2
    ],
    {{t1, 0.2, "Shadow Tonal Width"}, 0, 1},
    {{g1, 0.75, "Shadow Gamma"}, 0.1, 2.5},
    {{r1, 30, "Shadow Radius"}, 0, 100},
    {{t2, 0.2, "Highlight Tonal Width"}, 0, 1},
    {{g2, 1.5, "Highlight Gamma"}, 0.1, 2.5},
    {{r2, 30, "Highlight Radius"}, 0, 100}
]

虽然回复有点晚了……这是python和opencv复现的类似Phohoshop的阴影高光校正算法。