核心图像的色彩平衡

我正在尝试使用Core Image从Photoshop重新创建一个“filter”。 我得到了更容易的东西,如曝光,振动,色调曲线向下,但不知道如何复制阴影,中间调,高光的色彩平衡。 我尝试过CIColorMatrix,但它对调整相应阴影/中间调/高光的颜色效果不一样。 CIHighlightShadowAdjust也不会创建与Photoshop色彩平衡相同的色彩效果。

我可以使用什么来复制这种Photoshop色彩平衡,如下面的屏幕截图所示?

photoshop色彩平衡

我会在这里使用colormatrix尝试一些代码:

let colorFilter = CIFilter(name: "CIColorMatrix") colorFilter?.setValue(gammaOutput, forKey: kCIInputImageKey) colorFilter?.setValue(CIVector.init(x: 0.9, y: 0, z: 0, w: 0), forKey: "inputRVector") colorFilter?.setValue(CIVector.init(x: 0, y: 1.1, z: 0, w: 0), forKey: "inputGVector") colorFilter?.setValue(CIVector.init(x: 0, y: 0, z: 1.2, w: 0), forKey: "inputBVector") colorFilter?.setValue(CIVector.init(x: 0, y: 0, z: 0, w: 1), forKey: "inputAVector") colorFilter?.setValue(CIVector.init(x: 0, y: 0, z: 0, w: 0), forKey: "inputBiasVector") 

Core Image还允许开发自己的自定义图像filter。 所谓的自定义内核(CIKernel)是用OpenGL着色语言(GLSL)的方言编写的小程序,用于在GPU上运行自定义filter。

Photoshop是封闭源,目前还不清楚他们使用的是什么算法,但GIMP具有色彩平衡function,而且它是开源的。

可以在此处找到实现: https : //github.com/GNOME/gimp/blob/master/app/operations/gimpoperationcolorbalance.c

现在我们需要将其转换为GLSL。

幸运的是,澳大利亚开发商已经这样做了,请参阅https://gist.github.com/liovch/3168961#file-gistfile1-m-L4

要快速测试这是否能达到预期效果,可以使用Apple的一款名为Quartz Composer的酷实用程序。 您可以从Apple的开发者网站下载它,它隐藏在Xcode 9.3.dmg附加工具中

在那里你选择’Image Filter’作为模板,删除输入和输出图像旁边的所有节点。 从库中添加“核心图像filter”。 然后选择filter并按CMD-2。 您现在应该看到一个带有代码编辑器的检查器,该代码编辑器显示了一个简单的通用Core Image内核例程(CIKernel)。

由于我们只需要访问相应的源像素而不是整个图像,我们可以使用更具体的CIColorKernel而不是CIKernel函数。

其他参数可以添加到内核函数中。

鉴于上面的gist文件中的代码本身基于GIMP的颜色平衡例程,可以复制辅助函数RGBToL,RGBToHSL,HueToRGB,HSLToRGB。 然后是实际的CIColorKernel函数,我们只调整了函数签名和返回值:

 /* based on GIMP's color balance routine */ kernel vec4 balanceFilter(__sample textureColor, float redShift, float greenShift, float blueShift) { lowp float lightness = RGBToL(textureColor.rgb); lowp vec3 shift = vec3(redShift, greenShift, blueShift); const lowp float a = 0.25; const lowp float b = 0.333; const lowp float scale = 0.7; lowp vec3 midtones = (clamp((lightness - b) / a + 0.5, 0.0, 1.0) * clamp ((lightness + b - 1.0) / -a + 0.5, 0.0, 1.0) * scale) * shift; lowp vec3 newColor = textureColor.rgb + midtones; newColor = clamp(newColor, 0.0, 1.0); lowp vec3 newHSL = RGBToHSL(newColor); lowp float oldLum = RGBToL(textureColor.rgb); textureColor.rgb = HSLToRGB(vec3(newHSL.x, newHSL.y, oldLum)); return textureColor; } 

输入代码后,将自动编译。 然后,您可以在Composer中连接节点,请参见屏幕截图。 选择filter节点后​​,您可以使用CMD-1切换到输入检查器。 Composer使用redShift,greenShift和blueShift参数自动生成UI,例如,如果为greenShift输入-0.64,您会看到以下结果:

具有客户图像过滤器的Quartz Composer

一些额外的说明:

  • 源代码来自GIMP。 如果您想使用它,请阅读GIMP的许可证
  • GIMP的结果可能与Photoshop有很大不同,我不知道,但可能仍然是自己实验的一个很好的起点
  • 很明显,GIST的实现仅适用于中间调,但是通过GIMP源代码的链接,它应该很容易扩展为阴影和高光
  • 要在iOS应用程序中使用内核,您必须将内核代码包装在一个字符串中并将其提供给CIColorKernel构造函数