如何在iOS应用中从Adobe Lightroom重现高光和阴影效果

时间:2019-03-06 07:10:19

标签: ios image-processing gpuimage

我正在尝试在我的iOS应用程序中重现Adobe Lightroom效果。目前,我对所有效果都使用GPUImage,但发现难以重现“高光”和“阴影”效果。另外,我已经尝试过使用CIFilter中的CIHighlightShadowAdjust,但结果却是错误的。

因此,我正在寻找至少由Lightroom用于此效果的算法。它们两者都与亮度更改非常相似,但是看起来它们仅用于更改图片的明暗部分,具体取决于是否使用了高光或阴影。

任何人都可以指出正确的方向来实现相同的效果吗?如何仅更改图片的暗/亮部分的亮度?

这里是例子 1.左为原始图像,右为具有+100高光调整的图像(可能的范围是-100; 100,默认值为0)。

Highlights +100

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

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

Shadows + 100

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

1 个答案:

答案 0 :(得分:1)

似乎已应用了非线性亮度变换。例如,突出显示效果可能意味着只有图像的较亮部分具有更高的亮度,而阴影调整可能意味着图像的较暗部分具有更高的亮度。

一般方法是

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

亮度转换函数的一个特征是,它通常仅拉伸或压缩一定的亮度范围(在示例图像中可以很好地显示出来)。通常,这不仅仅需要一个参数(您需要定义受影响的直方图的范围以及强度)。看来Adobe具有一些启发式的功能,即它视为阴影,而其视为高光(可能是亮度直方图的平均值)作为截止值,而仅提供强度作为参数。

转换的确切形状也取决于您自己的口味。我玩了一些

看起来像您可以使用的突出显示的突出显示部分(转换为CIELAB,Ligthness L从0-100开始)是分段线性函数:

a = 1.5
b = 50
L(L>b)=a*L(L>b)-(a-1)*b

enter image description here

与您的阴影增强效果相似的阴影增强效果,我可以通过指数衰减的增强得到。

a = 4;
b = 20;
L = ((a-1)*exp(-L/b)+1) * L;

enter image description here

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