如何在 iOS 应用程序中重现 Adobe Lightroom 的高光和阴影效果
How to reproduce Highlights and Shadow effects from Adobe Lightroom in iOS app
我正在尝试在我的 iOS 应用程序中重现 Adobe Lightroom 效果。目前我对所有效果都使用 GPUImage
,但发现很难重现高光和阴影效果。此外,我已经尝试使用 CIFilter 中的 CIHighlightShadowAdjust
,但它给了我错误的结果。
所以我至少在寻找 Lightroom 用于此效果的算法。它们都与亮度变化非常相似,但似乎它们只用于改变图片的 light/dark 部分,这取决于是否使用了高光或阴影。
任何人都可以指出正确的方向吗?我需要看什么才能产生相同的效果?如何只改变 dark/light 部分图片的亮度?
这里是例子
1. 左边是原图,右边是+100高光调整后的图片(可能范围-100;100,默认为0)。
你可以看到天空(图像较亮的部分)有不同的亮度,但雕像几乎没有变化。
- 左边是原始图像,右边是 +100 阴影调整的图像(可能范围 -100;100,默认为 0)。
在这里你可以看到雕像(图片较暗的部分)亮度变化很大,但天空几乎没有变化。
看起来应用了非线性亮度变换。例如,高光效果可能意味着只有图像较亮的部分亮度增加更多,而阴影调整可能意味着图像较暗的部分亮度增加。
一般方法是
- 将 RGB 图像数据转换为颜色 space,亮度作为单独的维度,例如 HSL 或 CIELAB。
- 使用连续且单调递增但限制在允许值范围内的单个变换函数按像素方式变换 brightness/lightness/luminance。这类似于非线性拉伸或压缩亮度直方图。
- 用变换后的亮度替换原来的亮度。
- 转换回 RGB 颜色 space。
亮度变换函数的一个特点是它通常只拉伸或压缩特定的亮度范围(您在示例图像中很好地展示了这一点)。这通常需要的不仅仅是一个参数(您需要定义受影响的直方图的范围以及强度)。看起来 Adobe 有一些启发式算法,它认为什么是阴影,什么是高光(可能是亮度直方图的平均值)作为截止值,并且只提供强度作为参数。
变形的确切形状也取决于您自己的口味。我玩了一下
我可以用(转换为 CIELAB 并且 Ligthness L 从 0-100 变化)一个分段线性函数得到类似于你的突出显示的突出显示:
a = 1.5
b = 50
L(L>b)=a*L(L>b)-(a-1)*b
我可以通过指数衰减增强获得类似于您的阴影增强的阴影增强。
a = 4;
b = 20;
L = ((a-1)*exp(-L/b)+1) * L;
你看,我总是至少需要两个参数,我相信可以找到更好的变换函数,但结果强烈表明,本质上它只不过是一个亮度变换,可以在iOS 应用程序。尝试使用不同的转换函数可能会更好地了解什么是好的,什么不是。
我正在尝试在我的 iOS 应用程序中重现 Adobe Lightroom 效果。目前我对所有效果都使用 GPUImage
,但发现很难重现高光和阴影效果。此外,我已经尝试使用 CIFilter 中的 CIHighlightShadowAdjust
,但它给了我错误的结果。
所以我至少在寻找 Lightroom 用于此效果的算法。它们都与亮度变化非常相似,但似乎它们只用于改变图片的 light/dark 部分,这取决于是否使用了高光或阴影。
任何人都可以指出正确的方向吗?我需要看什么才能产生相同的效果?如何只改变 dark/light 部分图片的亮度?
这里是例子 1. 左边是原图,右边是+100高光调整后的图片(可能范围-100;100,默认为0)。
你可以看到天空(图像较亮的部分)有不同的亮度,但雕像几乎没有变化。
- 左边是原始图像,右边是 +100 阴影调整的图像(可能范围 -100;100,默认为 0)。
在这里你可以看到雕像(图片较暗的部分)亮度变化很大,但天空几乎没有变化。
看起来应用了非线性亮度变换。例如,高光效果可能意味着只有图像较亮的部分亮度增加更多,而阴影调整可能意味着图像较暗的部分亮度增加。
一般方法是
- 将 RGB 图像数据转换为颜色 space,亮度作为单独的维度,例如 HSL 或 CIELAB。
- 使用连续且单调递增但限制在允许值范围内的单个变换函数按像素方式变换 brightness/lightness/luminance。这类似于非线性拉伸或压缩亮度直方图。
- 用变换后的亮度替换原来的亮度。
- 转换回 RGB 颜色 space。
亮度变换函数的一个特点是它通常只拉伸或压缩特定的亮度范围(您在示例图像中很好地展示了这一点)。这通常需要的不仅仅是一个参数(您需要定义受影响的直方图的范围以及强度)。看起来 Adobe 有一些启发式算法,它认为什么是阴影,什么是高光(可能是亮度直方图的平均值)作为截止值,并且只提供强度作为参数。
变形的确切形状也取决于您自己的口味。我玩了一下
我可以用(转换为 CIELAB 并且 Ligthness L 从 0-100 变化)一个分段线性函数得到类似于你的突出显示的突出显示:
a = 1.5
b = 50
L(L>b)=a*L(L>b)-(a-1)*b
我可以通过指数衰减增强获得类似于您的阴影增强的阴影增强。
a = 4;
b = 20;
L = ((a-1)*exp(-L/b)+1) * L;
你看,我总是至少需要两个参数,我相信可以找到更好的变换函数,但结果强烈表明,本质上它只不过是一个亮度变换,可以在iOS 应用程序。尝试使用不同的转换函数可能会更好地了解什么是好的,什么不是。