3

HSL カラーの色相成分が度単位の場合、2 つの色相を正しく補間するにはどうすればよいですか? (h1 + h2) / 2 を使用しても、すべての場合に望ましい結果が得られるとは限りません。その理由を示す 2 つの例を次に示します。

させて:

赤 = 0°
黄 = 60°
青 = 240°

(赤 + 黄) / 2 = 30° (オレンジ)
(黄 + 青) / 2 = 150° (青緑)
(赤 + 青) / 2 = 120° (緑)

ご覧のとおり、赤と青を平均すると、紫/マゼンタではなく緑になります! ただし、次のようにします。

赤 = 360°
黄 = 60°
青 = 240°

(赤 + 黄) / 2 = 210° (青緑)
(黄 + 青) / 2 = 150° (青緑)
(赤 + 青) / 2 = 300° (マゼンタ)

ここで、赤と青は期待どおりの色を生成しますが、赤と黄色は青緑色を生成します! 色の色相成分をどのように補間して、実際の塗料を混ぜた場合に期待される結果と一致させることができますか? ありがとう!

4

3 に答える 3

3

あなたは基本的に、あなたが望むものを得るためにこの権利を行っています。これは、2つの入力の中間に見える色ですが、この計算がラップする円で行われるという事実に対処する必要があります。(「ペンキのように混ぜる」のではなく、中間の色だけを望んでいると思います。つまり、赤と緑が茶色になるのは望ましくありませんよね?)

円の 2 つの角度の間の角度を取得する Python 関数を次に示します。基本的には、2 つのオプション (360 を追加するかどうか) を試し、元の角度に最も近い角度を与えるものを選択します。

pairs = [(0, 60), (60, 239), (60, 241), (0, 240), (350, 30)]

def circ_ave(a0, a1):
    r = (a0+a1)/2., ((a0+a1+360)/2.)%360 
    if min(abs(a1-r[0]), abs(a0-r[0])) < min(abs(a0-r[1]), abs(a1-r[1])):
        return r[0]
    else:
        return r[1]

for a0, a1 in pairs:
    print a0, a1, circ_ave(a0, a1)

生成:

0 60    30.0
60 239  149.5  # 60, 240 is ambiguous
60 241  330.5
0 240   300.0
350 30  10.0

(この計算をもっと簡単に行う方法があるはずだと思いますが、思いつきませんでした。)

于 2009-09-13T04:11:12.707 に答える
1

すべての色の値について、またはx, x < 360である可能性があります。次に、4組の色の値があります。最小の距離ペアが見つかった場合は、そのペアを使用して色を補間します。それはあなたに正しい視覚効果を与えるかもしれません。xx+360

例えば、

赤=0°または360°
黄色=60°または420°
青=240°または600°

赤と黄色の最小距離は60(赤0黄60)なので、補間は30になります。
黄色と青の最小距離は180(黄色60青240)なので、補間は150になります
。赤と青は60(赤360青240)なので、補間は300にする必要があります。

于 2009-09-13T05:57:08.673 に答える
0

おそらくこれを聞きたくなかったでしょうが、RGB に変換し、補間して元に戻します。

編集:「実際の塗料を混ぜることが期待される」を見ただけ

その場合、おそらく RGB ではなく CMY 色空間に変換する必要があります。ウィキペディアの混色をご覧ください。

于 2009-09-13T01:23:27.040 に答える