如何在 iOS 应用程序中从 Adob​​e Lightroom 重现高光和阴影效果

Tar*_*nko 5 image-processing ios gpuimage

我正在尝试在我的 iOS 应用程序中重现 Adob​​e Lightroom 效果。目前我正在使用GPUImage所有效果,但发现很难重现高光和阴影效果。我也已经尝试使用CIHighlightShadowAdjustCIFilter 但它给了我错误的结果。

所以我正在寻找至少 Lightroom 用于此效果的算法。它们都与亮度更改非常相似,但似乎它们仅用于更改图片的亮/暗部分,具体取决于是否使用高光或阴影。

谁能指出我需要寻找的正确方向才能产生相同的效果?如何仅更改图片的暗/亮部分的亮度?

示例如下 1. 左为原始图像,右为经过 +100 高光调整的图像(可能范围 -100;100,默认为 0)。

亮点+100

你可以看到天空(图像较亮的部分)有不同的亮度,但雕像几乎没有改变。

  1. 左边是原始图像,右边是+100阴影调整的图像(可能的范围-100;100,默认为0)。

阴影 + 100

在这里你可以看到雕像(图片较暗的部分)的亮度变化很大,但天空几乎没有变化。

Tri*_*ion 3

看起来像是应用了非线性亮度变换。例如,突出显示效果可能意味着只有图像的较亮部分的亮度增加更多,而阴影调整可能意味着图像的较暗部分的亮度增加。

一般方法是

  • 将 RGB 图像数据转换为以亮度为单独维度的颜色空间,例如 HSL 或 CIELAB。
  • 使用连续且单调递增但限于允许值范围的单个变换函数按像素变换亮度/明度/亮度。这类似于非线性拉伸或压缩亮度直方图。
  • 将原始亮度替换为转换后的亮度。
  • 转换回 RGB 色彩空间。

亮度变换函数的一个特点是它通常仅拉伸或压缩特定的亮度范围(您在示例图像中很好地展示了这一点)。这通常需要多个参数(您需要定义受影响的直方图的范围以及强度)。看起来 Adob​​e 有一些启发式方法,将其视为阴影的内容和将其视为高光的内容(可能是亮度直方图的平均值)作为截止值,并且仅提供强度作为参数。

变换的具体形状也取决于您自己的喜好。我玩了一下

突出显示看起来与您的突出显示相似,我可以使用分段线性函数(转换为 CIELAB 和亮度 L 从 0-100)得到:

a = 1.5
b = 50
L(L>b)=a*L(L>b)-(a-1)*b
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

阴影增强看起来类似于我可以通过指数衰减增强获得的阴影增强。

a = 4;
b = 20;
L = ((a-1)*exp(-L/b)+1) * L;
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

你看,我总是需要至少两个参数,并且我相信可以找到更好的转换函数,但结果强烈表明,本质上它只不过是一种亮度转换,可以在 iOS 应用程序中重现。使用不同的转换函数可能会让您更好地了解什么是好的,什么是不好的。