【问题标题】:HSL color adjustment filter in an iOS 8.0+ app using CoreImage使用 CoreImage 的 iOS 8.0+ 应用程序中的 HSL 颜色调整过滤器
【发布时间】:2016-03-22 02:50:41
【问题描述】:

我们希望使用CoreImageiOS 8.0+ 应用中实现HSL 颜色调整滤镜。

加载图像后,用户选择一种颜色(如红色),然后可以调整色调饱和度亮度 strong> 只有图像中的那种颜色。在显示预览时,此过滤器可能会在一秒钟内应用多次,因此性能非常重要。

过滤器应该接受 inputImage、目标颜色的参数,然后调整 huesaturationluminance

CIImage *inputImage
UIColor *targetColor
float hueAdjustment (identity 0)
float saturationAdjustment (identity 0)
float luminanceAdjustment (identity 0)

我们已经尝试过这个方法,因为这会将HSB过滤器应用于整个图像而不是某些颜色,所以我们不能使用这个 How to apply HSB color filters to UIImage

我感觉这涉及到CIColorMatrix,但我不确定我们如何让矩阵只应用于特定的颜色范围。

【问题讨论】:

  • 听起来很愚蠢,你对“颜色”的定义是什么?如果我选择红色 - (1.0, 0.0, 0.0) - 并将其映射为蓝色,那么我的源图像中的像素会发生什么,例如(0.99, 0.0, 0.0)?因数字上不同的颜色而保持不变,由于足够接近而完全调整为纯红色,根据与红色的接近程度相关的某个比例量进行调整,或其他什么?
  • 一点也不傻。正如你所说,它应该按比例调整颜色。比例本身可以设置为“容差”或其他变量,可能调整每种颜色的容差,或通过其他类似方法

标签: ios objective-c swift opengl-es core-image


【解决方案1】:

如果您愿意简单地控制红色、绿色和蓝色,有一个简单的解决方案。我写了一个小的CIColorKernel,它接受三张图像并通过单独的通道将它们组合成一张:

kernel vec4 rgbChannelCompositing(__sample red, __sample green, __sample blue)
{
    return vec4(red.r, green.g, blue.b, 1.0);
}

这意味着您可以将控制色调 (CIHueAdjust)、饱和度和亮度 (CIColorControls) 的三个 CI 过滤器链应用于您的单个图像,并将它们与我的内核结合。

碰巧,我已经按照这些思路做了一些事情 - 你可以在这里查看我的 Swift 代码:https://github.com/FlexMonkey/Filterpedia/blob/master/Filterpedia/customFilters/RGBChannelCompositing.swift

希望有帮助!

西蒙

【讨论】:

  • 谢谢!这可能会有所帮助,但我们正在使用 8 种特定颜色,例如 (0.27, 0.90, 0.27) 而不仅仅是 RGB,所以您知道如何调整它以使用任意颜色吗?
【解决方案2】:

编辑:已完成的过滤器(在 Swift 中)为 available here!

好的,那么另一种方法怎么样。您可以使用 Core Image 颜色内核对每个波段应用单独的处理,其中包含以下代码:

kernel vec4 rgbChannelCompositing(__sample pixel, vec3 hsl0, vec3 hsl1, [...])
{
    float hue = rgb2hsv(pixel).x; // there are lots of rgb2hsv() on the internet :)

    if (hue < color1)
    {
        return treatment(pixel, hsl0); 
    }
    else if (hue >= color1 && hue < color2)
    {
        return treatment(pixel, hsl1);
    }
    [...]

treatment() 函数将根据传递给内核函数的色调、饱和度和亮度值发挥作用。这可以像调整 HSV 值一样简单,使用 Internet 上的众多 hsv2rgb() 实现之一将它们转换回 RGB 并返回。

您可能会得到一些条带,在这种情况下,smoothstep() 会有所帮助。我做了类似的事情来创建一个伪彩色滤镜。就我而言,我是根据光度而不是颜色来定义波段,但基本方法是相同的(我认为!)。

查看我的CustomFilters.swift 文件中的PseudoColor

【讨论】:

  • 嗨,我知道这是一个很老的答案,但是在调整亮度时,会发生很多条带。你知道有没有办法摆脱那里的一些条带?条纹在视频中尤其明显。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-21
  • 1970-01-01
  • 2014-05-05
  • 1970-01-01
  • 1970-01-01
  • 2013-10-03
  • 1970-01-01
相关资源
最近更新 更多