- 締切済み
色混ぜのアルゴリズム
このジャンルでお願いします。 例えば絵の具などで黄色と青色を混ぜると緑色(またはそれに近い色) になると思いますが、これをプログラムで再現しようとすると (白色)rgb(255,225,255) = (黄色)rgb(255,225,0)+(青色)rgb(0,0,255) になってしまいます・・・ どのような割合でrgbを調節すれば、理想とする結果が得られるのでしょうか?
- みんなの回答 (7)
- 専門家の回答
みんなの回答
- Yanch
- ベストアンサー率50% (114/225)
> ご返答ありがとうございます。 > なるほど、一応緑色にはなってるわけですね。ただ暗いだけで。 > >明るさ等あるので、 > >より、忠実に再現したいなら、何か補正を掛けてあげる必要があると思います。 > その補正値は具体的にどのようになるか分かりますか? > それはsnowizeさんが仰るように、色彩の勉強が必要なぐらいのことなのでしょうか? 色の補正については、追究していくと、切りがないので、掲示板で質問するのは難しいかと思います。
- Oh-Orange
- ベストアンサー率63% (854/1345)
★アドバイス ・この質問は絵の具と同じ感じで色を混ぜ合わせるアルゴリズムですか? そう解釈しましたので『半透明処理』で調べればよいと思います。 例: http://eternalwindows.jp/graphics/bitmap/bitmap11.html→『アルゴリズム』 ここに色を混ぜ合わせる公式があります。→RGB方式 抜粋すると 『dest = src * (alpha / 255) + dest * (1 - (alpha / 255));』 です。これは赤・緑・青の1つの成分であるため3つ処理します。 詳しくは次のサイトなどを参考にして下さい。 http://www.sm.rim.or.jp/~shishido/toumei.html→『パレットによる半透明処理』 http://www13.plala.or.jp/kymats/study/MULTIMEDIA/bmp_semitransparent.html→『半透明処理』 http://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%AB%E3%83%95%E3%82%A1%E3%83%96%E3%83%AC%E3%83%B3%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0→『アルファブレンド』 ・ネット検索するときは『半透明』または『半透明処理』とか、 『アルファブレンド』『AlphaBlend』で調べます。 API関数では http://msdn.microsoft.com/ja-jp/library/cc428300.aspx→『AlphaBlend』 がります。 考え方: 『黄色』と『緑色』を1:1で混ぜるとき(RGB方式) 黄色=250,240,0(これを背景と考える) 緑色=0,230,0(こちらを前景と考える) となり alpha=128(50%) とすると 赤輝度= 0 * (alpha / 255) + 250 * (1 - (alpha / 255))=124 緑輝度=230 * (alpha / 255) + 240 * (1 - (alpha / 255))=177 青輝度= 0 * (alpha / 255) + 0 * (1 - (alpha / 255))=0 となります。 よって『黄色』と『緑色』を1:1の比(50%)で混ぜ合わせると 赤輝度=124 緑輝度=177 青輝度=0 ↓ RGB=124,177,0 となります。 CYMも同じ考えて混ぜ合わせれば良いでしょう。
お礼
ご返答ありがとうございます。 >・この質問は絵の具と同じ感じで色を混ぜ合わせるアルゴリズムですか? これはそうですが、それに半透明が関わってくるかどうかは 自分の知識ではまだ分からないのです・・・ その計算式(alpha=128(50%)で)だとたしかに 水色rgb( 0, 255, 255) と黄色rgb(255, 255, 0)の混合はrgb(128, 255, 128)になり、 明るい緑色(黄緑色)になるのですが、 (青色)rgb( 0, 0, 255) と(赤色)rgb(255, 0, 0) の混合はrgb(128, 0, 128) になって理想としては紫っぽい色を期待してたのですが、暗い色になってしまい、 (黒色)rgb( 0, 0, 0) と(白色)rgb(255, 255, 255) の混合はrgb(128, 128, 128) になって理想としては灰色(rgb(200, 200, 200)ぐらいの色です)を期待してたのですが、 これも暗い色になってしまいます・・・ やはりYanchさんが仰るように明るさ等を補正する必要があるのでしょうか? それを具体的にご存知でしょうか?
- Yanch
- ベストアンサー率50% (114/225)
●RGBからCYMに変換する式 RGBとCYMの相互変換の式はむずかしくないと思います。 C←255-R Y←255-B M←255-G で良いはずです。 ●(水色)cym(255, 0, 0)と(黄色)cym(0, 255, 0)を1:1で混ぜた場合 > (((水色)cym(255, 0, 0) × 1) + ((黄色)cym(0, 255, 0) × 1)) ÷ 2 > =(cym(255, 0, 0) + cym(0, 255, 0)) ÷ 2 > =cym(255, 255, 0) ÷ 2 > =cym(128, 128, 0) > になって(緑色)cym(255, 255, 0)にはならなくないですか? > それともどこかおかしいところがあるのでしょうか? この式だと、暗い緑色になってしまいますね。 色の要素は、CYMの三原色だけではなく、明るさ等あるので、 より、忠実に再現したいなら、何か補正を掛けてあげる必要があると思います。
お礼
ご返答ありがとうございます。 なるほど、一応緑色にはなってるわけですね。ただ暗いだけで。 >明るさ等あるので、 >より、忠実に再現したいなら、何か補正を掛けてあげる必要があると思います。 その補正値は具体的にどのようになるか分かりますか? それはsnowizeさんが仰るように、色彩の勉強が必要なぐらいのことなのでしょうか?
- Yanch
- ベストアンサー率50% (114/225)
例えば、 (紫色)cym(0, 0, 255)に(赤色)cym(0, 255, 255)を3:1で混ぜたら、 と言う計算なら、 三次元色空間を想像して、その2点間の値を取れば良いと思いますよ。 (((紫色)cym(0, 0, 255) × 3) + ((赤色)cym(0, 255, 255) × 1)) ÷ 4 =(cym(0, 0, 765) + cym(0, 255, 255)) ÷ 4 =cym(0, 255, 1020) ÷ 4 =cym(0, 63, 255) こんな感じで近い物が得られると思います。
お礼
ご返答ありがとうございます。 なるほど、三次元での座標で考えるというのは わかり易くて助かりました。ありがとうございます。 あと1つ疑問があるのですが、ここ(cym(0, 63, 255))から 光の三原色(RGB)rgb(?,?,?)に変換するにはどうすれば良いのでしょうか? 青とか緑とか対応が判明してる色なら変換できるのですが・・・
補足
あ、すいません・・・ snowizeさんが紹介してくれたサイト http://homepage2.nifty.com/studio_AURK/ccconv/Color/rgb_cmyk.html に書いてありました。 それで試してみます。
- snowize
- ベストアンサー率27% (68/245)
簡単な変換でしたら参考URLの計算式でいいと思いますよ。 めちゃくちゃ本格的にいきたい場合は、色彩のお勉強をするしかないかと^^; 自分は色彩検定3級とか持ってますが、ネタですしね。ほとんど。
お礼
ご返答ありがとうございます。 どこまで再現するかによるんでしょうけど、 なんとなく自分が考えてる以上に奥が深そうですね・・・
補足
度々すいません・・・ 新たに疑問に気づくのが返信してからという自分の悪い癖で、、 Yanchさんに対する質問(できればみなさんにも答えて頂きたいです) なんですが、書く場所がないのでこの場所を貸してください。 ANo.4のYanchさんの計算式だと(水色)cym(255, 0, 0)と(黄色)cym(0, 255, 0)を 1:1で混ぜた場合の式は (((水色)cym(255, 0, 0) × 1) + ((黄色)cym(0, 255, 0) × 1)) ÷ 2 =(cym(255, 0, 0) + cym(0, 255, 0)) ÷ 2 =cym(255, 255, 0) ÷ 2 =cym(128, 128, 0) になって(緑色)cym(255, 255, 0)にはならなくないですか? それともどこかおかしいところがあるのでしょうか?
- Yanch
- ベストアンサー率50% (114/225)
光の三原色(RGB)と色の三原色(CYM)の対応は次のような感じ。 (黒色)rgb( 0, 0, 0) cym(255, 255, 255) (青色)rgb( 0, 0, 255) cym(255, 0, 255) (緑色)rgb( 0, 255, 0) cym(255, 255, 0) (水色)rgb( 0, 255, 255) cym(255, 0, 0) (赤色)rgb(255, 0, 0) cym( 0, 255, 255) (紫色)rgb(255, 0, 255) cym( 0, 0, 255) (黄色)rgb(255, 255, 0) cym( 0. 255, 0) (白色)rgb(255, 255, 255) cym( 0. 0, 0) 色まぜアルゴリズムを作るなら、これに輝度とかを併せて計算すると良いと思いますよ。 色の合成だと、(緑色)cym(255, 255, 0)は(水色)cym(255, 0, 0)+(黄色)cym(0. 255, 0) になりますけどね。 ●記号の意味 R:Red:赤 G:Green:緑 B:Blue:青 C:Cyan:水色 Y:Yellow:黄色 M:Magenta:紫
お礼
ご返答ありがとうございます。 なるほど、その8色(黒青緑水赤紫黄白色)の対応は分かったのですが、 それ以外、例えばrgb(100, 150, 100)のcym(?,?,?)はどのようになるのでしょうか? それは計算で出せるものなのでしょうか?
補足
補足です。 自分の理想としては、 赤と青を混ぜたら紫(厳密には違うかもしれませんが)になって その紫にさらに赤を混ぜたら違う色になって、その色に別の色混ぜたら・・・・・ というぐあいに、現実の絵の具のような結果のように それをプログラム(PC上)で再現できるようにしたいです。 >色の合成だと、(緑色)cym(255, 255, 0)は(水色)cym(255, 0, 0)+(黄色)cym(0. 255, 0) >になりますけどね。 この例だと、たしかに (緑色)cym(255, 255, 0) = (水色)cym(255, 0, 0)+(黄色)cym(0. 255, 0) なんですが、その緑色にさらに黄色を混ぜていったら現実の絵の具では より黄色に近づいていくと思うのですが、そのような再現はできるものなのでしょうか?
- arain
- ベストアンサー率27% (292/1049)
そもそもの問題として、 絵の具の三原色は「R/G/Y」(同量混色:黒)であり、PC等は光の三原色「R/G/B」(同量混色:白)なので考え方が違います。 やろうとしたら、光と絵の具の違いを吸収する変換テーブルを作成するしかありません。
お礼
ご返答ありがとうございます。 なるほど、根本的に違いますね。
お礼
ご返答ありがとうございます。 そうですか・・・自分としては1,2程度の色の誤差なら構わないと思ってるのですが、 さすがに128と200の差があると見た目が違うので、、 その差を埋めるのはやっぱり難しい勉強が必要なのかなぁ