3

こんにちは
、私は画像処理の初心者です。フォトショップの「セレクティブカラー」や「カラーバランス」と同じように、IOSで色変化フィルターをやりたいです。しかし、私はこれらの素晴らしい機能のアルゴリズムを知りません。
Paint.Net のソース コードで検索しようとしましたが、残念ながら、PainDotNet にはこの機能がありません。

カラーバランスで、このリンクのカラーバランスをiPhoneで試してみましたが、うまくいきません。Photoshopの結果とは異なります。

では、セレクティブ カラーとカラー バランスという 2 つの手法のアルゴリズムを知っている人はいますか?

ありがとうございます。私の複雑なプレゼンテーションについて申し訳ありません

4

4 に答える 4

3

私は2日間これに対する解決策を見つけようとしてきましたが、いくつかの結果が得られましたが、Photoshopの実装とは異なり、正確ではないことを恐れています.

私がアプローチしようとしている方法は、RGB カラーを HSL カラー スペースに変換してから、異なる軸 (シアン/レッド、イエロー/ブルー、グリーン/マゼンタ) に沿って色相と彩度のカラー値を調整することです。ここで説明されているように、極座標系ではなくデカルト座標系を使用してこれを行っています: http://en.wikipedia.org/wiki/HSL_and_HSV#Hue_and_chroma

私の考えでは、デカルト座標空間 (アルファ軸とベータ軸を持つ) でアルファを変更すると、シアン/レッド軸に沿って色が変更されます。黄色/青色の軸に沿って色を変更するには、アルファとベータを同時に変更します。

alpha = alpha + adjustment * cos(PI/3)
beta = beta + adjustment * sin(PI/3)

他の軸についても同じことができます。新しいアルファ値とベータ値を取得したら、それらを HSL に変換してから RGB に変換できます。

残念ながら、Photoshop の実装とは異なり、結果は依然として静かです。また、残りの色に触れずに、レッド、イエロー、ニュートラル、ブラックなどのみを調整する適切な方法がわかりません。

この種の調整をどのように達成できるかについてのヒントはありますか?

更新:
ここでは、GIMP と Photoshop のカラー バランス フィルターについて説明します: https://github.com/BradLarson/GPUImage/issues/193


GIMP カラー バランス フィルターをシェーダーとして再作成するサンプル コード
を次に示します。
残念ながら、GIMP のカラー バランス フィルタは、Photoshop とは異なる結果をもたらします :(

GPUImage フレームワーク用のカラー バランス フィルターを作成しました: https://github.com/liovch/GPUImage/commit/fcc85db4fdafae1d4e41313c96bb1cac54dc93b4

于 2012-07-21T05:24:14.760 に答える
1

多分これが役立つでしょう。Adobe のシェーダー言語である Pixel Bender を介して、Photoshop と Flash の拡張機能としてこれを書きましたが、他のシェーダー言語と同等です。これは、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
        }
}
}
于 2013-07-21T15:18:37.383 に答える
0

カラーバランスについては、赤/シアンの調整は赤チャンネルの値を、マゼンタ/緑の調整は緑に、黄/青の調整は青に変更します。これで問題は解決しました。
しかし、Photoshop のように明るさを維持するオプションを使用すると、1 つのピクセルの明るさを一定に保つ必要があります (元のピクセルとカラー バランスの取れたピクセル)。

私はGimpのソースコードを読んで、新しいピクセルのRGBをHSLに変換し、Lを古いピクセルのL値に置き換えてから、新しいHSLをRGBに変換してこの問題を解決しました。この RGB 値は、色のバランスを取りながらピクセルの明るさを維持します。ただし、GIMPでテストするとき、「明度を維持する」オプションでシャドウとハイライトモードのカラーチャンネルを調整しますが、間違っています。

シャドー、ミッドトーン、またはハイライトを決定する方法を混乱させていますか?

于 2012-07-24T02:01:03.420 に答える