2011-07-27 14 views
3

私は複雑な問題がありますが、この小さな問題によって解決することができます。私はピクセルごとに動作するカラー化をしたいと思います。HSLカラーで色を塗る方法は?

私は(画像はこの色とこの色に近くにいる他の画素、の多くのいくつかの画素を有する)絵のために定義されベースカラーを持っている:

Hex: #188DD9 
HSL: 204° 80% 47% 
RGB: 24 141 217 

私は私のを知っていますターゲットベースカラーは:

Hex: #23752E 
HSL: 128° 54% 30% 
RGB: 35 117 46 

だから、私はイメージを色付けしたいと思います。

私は、この2つのHSL値に相関があると仮定して、 ピクセル単位で色を付けることができます。

現在、基本色相を(目標色相 - 基本色相)= -76で移動すると、色相が良好であることがわかりました。

この問題を解決するために、彩度と明度の間の接続がどこにあるか教えてください。

答えて

2

マップを使用して最終的には、黒を白、白を、灰色を灰色にマッピングするとします。

添加マッピング

H」= H +(H ターゲット - H ベース)あなたは色相に使用

(ラップアラウンドとは)確かに、おそらく大丈夫です。飽和のために、グレー値を保存する必要が

S」= S *(S 標的/S ベース)、クリ​​ップされた100%飽和を超える値を有する

乗法マッピングを示唆しています。しかし、明度については、中間値を調整しながら0%と100%の両方の明度を固定したいので、線形マップはそれを行わないだけです。自然な選択ではなく、*

L」= POW(L、ログ(L ターゲット)/ログ(L ベース))= EXP(ログ(L)すなわち、gamma型マップであるかもしれませんlog(L ターゲット)/ log(L ベース))。明度値が0と1の間にスケーリングされ

(注:ピクセルの多くのために効率的にこのマップを計算するには、あなたはおそらく256の項目、たとえば、のルックアップテーブルを事前に計算します。)

もちろん、あなたが使うことができる他のマップはたくさんありますが、これらから始めて、十分な結果が得られるかどうかを確認します。最終的に、結果の品質は、HSL色空間の知覚的不均一性によっても制限されることに注意してください。詳細はthis Wikipedia pageを参照してください。

+0

ありがとうございました!それは正常に働いた。私は改善を1つだけ行いました。最終的な色(赤または緑または青)に近いいくつかの目標値では、カラー化後に間違った色がありました。改善は次のとおりです。if(S> Sbase)S = Sbase; S 'を計算する前 –

+0

最初に 'if(S'> Smax)S '= Smax;'を使ってみましたか?Smaxは最大有効彩度です(通常は1.0,100,255など)。 Ps。私は長いintまたは浮動小数点を使用して中間の計算を行うことをお勧めします。さもなければ算術オーバーフローによって噛まれるかもしれません。また、intを使用する場合は、除算の前に乗算を行うことを忘れないでください。 –

+0

いいえ、私はそれを試していませんでした。今私は試してみましたが、同じ結果が得られ、あなたのソリューションは論理的です。 :) ありがとうございました! –

関連する問題