Photoshop中的选择性颜色和色彩平衡滤镜是如何工作的?

4
大家好,我是一个新手,想在iOS上做一些颜色变化滤镜,就像Photoshop中的“选择性颜色”和“色彩平衡”。然而,我不知道这些很棒的功能的算法。我试过在Paint.Net的源代码中查找,但不幸的是,PaintDotNet没有这个功能。
对于色彩平衡,我尝试了 iPhone上的色彩平衡,但结果不太好。它与Photoshop的结果不同。
那么,有人知道两种技术的算法:选择性颜色和色彩平衡吗?
谢谢你们,对我的复杂表达感到抱歉。

有关选择性着色,请参阅此文章:https://blog.pkh.me/p/22-understanding-selective-coloring-in-adobe-photoshop.html 对于颜色平衡,似乎是这个问题答案的重点,但尚未找到令人满意的解决方案。 - Keavon
4个回答

3
我已经试了两天来解决这个问题,虽然有一些结果,但是它们与Photoshop的实现不同,我担心并不完全正确。我的方法是将RGB颜色转换为HSL颜色空间,然后沿不同轴(青色/红色、黄色/蓝色、绿色/品红)调整色相和饱和度颜色值。我使用笛卡尔坐标系而不是极坐标系来实现这一点,如此描述:http://en.wikipedia.org/wiki/HSL_and_HSV#Hue_and_chroma。我的想法是,在笛卡尔坐标空间(带有alpha和beta轴)中,改变alpha会导致沿着青/红轴修改颜色。通过同时修改alpha和beta,可以沿黄/蓝轴改变颜色:alpha = alpha + adjustment * cos(PI/3),beta = beta + adjustment * sin(PI/3)。其他轴也可以采用同样的方法进行调整。在获得新的alpha和beta值之后,可以将它们转换为HSL,然后再转换为RGB。不幸的是,结果仍然与Photoshop的实现有很大不同。而且我无法找到适当的方法只调整红色、黄色、中性、黑色等,而不触及其他颜色。有人对如何实现这种类型的调整有什么提示吗?更新:这里是关于GIMP和Photoshop中的色彩平衡滤镜的讨论:https://github.com/BradLarson/GPUImage/issues/193。这是一个重新创建GIMP色彩平衡滤镜作为着色器的示例代码:https://gist.github.com/3168961。目前只实现了中间调,但应该很容易对高光和阴影进行更改。不幸的是,GIMP的色彩平衡滤镜与Photoshop给出了不同的结果。我已经为GPUImage框架创建了一个色彩平衡滤镜:https://github.com/liovch/GPUImage/commit/fcc85db4fdafae1d4e41313c96bb1cac54dc93b4

Gimp的颜色平衡选项只有在保留亮度选项(即将图片亮度保持与原始状态一致)时才会出现问题。(只有中间色调可以使用此选项)我正在寻找解决该问题的方法。有什么想法吗? - Hai Hw

1
也许这会有所帮助。我将其编写为Photoshop和Flash扩展,使用Pixel Bender进行编程,这是Adobe的着色器语言,但与任何其他着色器语言等效。这大致上将Adobe ShaderLab转换为CG着色器语言。
Shader "Filters/ColorBalance"
{
Properties
{
    _MainTex ("Main (RGB)", 2D) = "white" {}
    // Red, Green, Blue
    _Shadows ("shadows", Vector) = (0.0,0.0,0.0,0.0)
    _Midtones ("midtones", Vector) = (0.0,0.0,0.0,0.0)
    _Hilights ("hilights", Vector) = (0.0,0.0,0.0,0.0)
    _Amount ("amount mix", Range (0.0, 1.0)) = 1.0
}

SubShader
{
    Tags {"RenderType"="Transparent" "Queue"="Transparent"}
    Lighting Off

    Pass
    {
        ZWrite Off
        Cull Off
        Blend SrcAlpha OneMinusSrcAlpha

        CGPROGRAM
        #pragma vertex vert
        #pragma fragment frag
        #pragma fragmentoption ARB_precision_hint_fastest
        #include "UnityCG.cginc"

        sampler2D _MainTex;

        uniform float4 _Shadows;
        uniform float4 _Midtones;
        uniform float4 _Hilights;
        uniform float _Amount;

        uniform float pi = 3.14159265358979;            

        struct appdata
        {
            float4 vertex : POSITION;
            float2 texcoord : TEXCOORD0;
            float4 color : COLOR;
        };

        // vertex output
        struct vertdata
        {
            float4 pos : SV_POSITION;
            float2 texcoord : TEXCOORD0;
            float4 color : COLOR;
        };

        vertdata vert(appdata ad)
        {
            vertdata o;
            o.pos = mul(UNITY_MATRIX_MVP, ad.vertex);
            o.texcoord = ad.texcoord;
            o.color = ad.color;
            return o;
        }

        fixed4 frag(vertdata i) : COLOR
        {               
            float4 dst = tex2D(_MainTex, i.texcoord);
            float intensity = (dst.r + dst.g + dst.b) * 0.333333333;  

            // Exponencial Shadows
            float shadowsBleed = 1.0 - intensity;
            shadowsBleed *= shadowsBleed;
            shadowsBleed *= shadowsBleed;

            // Exponencial midtones
            float midtonesBleed = 1.0 - abs(-1.0 + intensity * 2.0);
            midtonesBleed *= midtonesBleed;
            midtonesBleed *= midtonesBleed;

            // Exponencial Hilights
            float hilightsBleed = intensity;
            hilightsBleed *= hilightsBleed;
            hilightsBleed *= hilightsBleed;

            float3 colorization = dst.rgb + _Shadows.rgb * shadowsBleed + 
                                            _Midtones.rgb * midtonesBleed +
                                            _Hilights.rgb * hilightsBleed;   

            dst.rgb = lerp(dst.rgb, colorization, _Amount);
            return dst;
        }
        ENDCG
        }
}
}

0
关于色彩平衡,红色通道值用于红/青调整,绿色用于洋红/绿色,蓝色用于黄/蓝。这解决了问题。
但是,如果像Photoshop中一样保留亮度选项,我们必须保持一个像素的亮度恒定(原始和颜色平衡像素)。我阅读了Gimp的源代码,它使用将新像素的RGB转换为HSL来解决此问题,将L替换为旧像素的L值,然后将新的HSL转换回RGB。这个RGB值在平衡颜色的同时保持像素的亮度。然而,当我在GIMP上测试“保留亮度”选项的阴影和高光模式的颜色通道时,出现了错误。

我很困惑如何确定阴影、中间色调或高光?


-1

选色的神秘

红色是由品红、黄色和黑色(没有青色)组成的颜色。然而,如果您选择了红色范围并减少了青色,颜色会发生变化。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接