Photoshop的可选颜色和色彩平衡滤镜如何工作?

时间:2012-07-20 10:01:04

标签: ios image-processing colors photoshop

大家好,我是图像处理的新手。我想在IOS上做一些换色滤镜,就像在photoshop中的“选择色”和“色彩平衡”一样。但是,我不知道这些令人敬畏的功能的算法。
我试过在Paint.Net的源代码中找到但不幸的是,PainDotNet没有这个功能。

通过色彩平衡,我尝试了这个链接color balance on the iPhone但结果并不好。这与photoshop的结果不同。

所以有人知道两种技术的算法:选择性颜色和色彩平衡吗?

谢谢你,对我复杂的演讲感到抱歉

4 个答案:

答案 0 :(得分:2)

我已经试图找到一个解决方案2天了,得到了一些结果,但它们与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

答案 1 :(得分:1)

也许这会有所帮助。我通过Pixel Bender将其写为photoshop和flash扩展 这是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
        }
}
}

答案 2 :(得分:0)

关于色彩平衡,更改红色/青色调整的红色通道值,绿色为品红色/绿色,蓝色为黄色/蓝色。这解决了问题。
但是如同在photoshop中使用保留光度选项一样,我们必须保持一个像素的亮度不变(原始和颜色平衡像素)。

我阅读Gimp的源代码,它使用转换RGB解决了这个问题将新像素替换为HSL,将L替换为旧像素的L值,然后将新HSL转换回RGB。在平衡颜色的同时,该RGB值保持像素的亮度。但是,当我在GIMP上测试时,使用“保留光度”选项调整阴影和高光模式的颜色通道,这是错误的。

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

答案 3 :(得分:0)

选择性色彩之谜

红色是颜色,由洋红色,黄色和黑色(无青色)组成。但是,如果选择红色范围并减少青色,则颜色会发生变化。