重複の可能性:
PHP の色間の「距離」
RGB 値が特定のピンクの色合いであるかどうかを検出したいと考えています。ピンクの線形順序に従う RGB または 16 進値の範囲がないように見えるため、これをどのように進めるかはわかりません (ピンクの 1 つの色合いは255, 182, 193; #FFB6C1
で、別の色合いは です238, 162, 173; #EEA2AD
)。私の範囲の開始と終了の RGB/hex 値を知っていると仮定して、何をすべきかについて何か考えがありますか?
重複の可能性:
PHP の色間の「距離」
RGB 値が特定のピンクの色合いであるかどうかを検出したいと考えています。ピンクの線形順序に従う RGB または 16 進値の範囲がないように見えるため、これをどのように進めるかはわかりません (ピンクの 1 つの色合いは255, 182, 193; #FFB6C1
で、別の色合いは です238, 162, 173; #EEA2AD
)。私の範囲の開始と終了の RGB/hex 値を知っていると仮定して、何をすべきかについて何か考えがありますか?
それは私にはかなり直線的に見えます。ただし、色彩理論を少し理解する必要があります。
質問に答える前に、ここに色彩理論の簡単な復習を含めてもかまいません。しかし、それは解決策を理解または策定するのに役立ちます。
まず、ほとんどの人が幼稚園で学んだカラーホイールを覚えていると思います。
Red
Red Orange | Purple
| \_|_/
_o_ ----------> _o_
/ \ / | \
Yellow Blue Yellow | Blue
Green
さて、少し変更する必要があります。マゼンタとイエローを混ぜると赤になり、シアンと少し赤を混ぜるとブルーになるので、赤と青は実際には原色ではないことがわかります。したがって、変更されたカラーホイールは印刷色を使用します:CMY:
Magenta
Red | Blue
\_|_/
_o_
/ | \
Yellow | Cyan
Green
これは基本的にHSV色空間です(Sは通常、ホイールの中心から端に向かってプロットされ、Vはまったくプロットされませんが、通常はスライダーで変更できます)。これは、CMYの印刷色から派生しています。では、これは画面の色をRGBにするのにどのように役立ちますか?
それを注意深く見ると、実際には印刷と画面の色空間の両方を組み合わせたものであることがわかります。実際には、CMYとRGBの関係を示しています。
Magenta Magenta
Red | Blue | Red Blue
\_|_/ | \_ _/
_o_ == _o_ + o
/ | \ / \ |
Yellow | Cyan Yellow Cyan |
Green Green
したがって、このカラーホイールを理解することで、任意のRGBカラーを理解できます。たとえば、RGBには黄色はありません。ただし、黄色は青の反対であることに注意してください。したがって、黄色を取得するには、色から青を減算します。
rgb(100,80,10) is a "yellowish" version of rgb(100,80,120)
^ ^
このカラーホイールを理解すると、RGB値を操作する方が理にかなっています。#rrggbb
十分に練習すれば、カラーチャートを参照せずに、構文で直接色を作成および編集できます。
だから、あなたの質問に答えるために。ピンクのターゲットの色合いは次のとおりです。
rgb(255,182,193)
「ピンク」の色については、次の2つのことがわかっています。
私たちはそれを一種の赤として認識しています。したがって、ターゲットカラーの赤の値が高いことは理にかなっています(実際には最大です)。
私たちはそれを非常に明るい赤として認識しています。したがって、赤以外のコンポーネントも非常に高い(両方とも150を超える)ことは理にかなっています。
したがって、色合いをターゲットカラーに近づけるには、次のものが必要です。
この定義により、ピンクは次のように識別できます。
// Pseudo code:
is_pink (R,G,B) {
return R > 200 && // make sure R is high
G > 150 && // make sure G & B are relatively high
B > 150 &&
R > G && // make sure G & B are not higher than R
R > B;
}
GとBがかなり類似していることを確認することで、わずかに青みがかったまたは緑がかった「ピンク」を拒否する別の条件を追加できます。
// Pseudo code:
is_pink (R,G,B) {
return R > 200 &&
G > 150 &&
B > 150 &&
R > G &&
R > B &&
abs(G-B) < 20; // make sure it's neither bluish or greenish
}
ピンクがかった色の好みに合わせて200、150、20の値を微調整できますが、上記の関数を両方のテストカラーに適用する(255,182,193)
と(238,162,173)
、両方が「ピンク」として識別されることがわかります。