d13: RGB値を何回で当てれるか

コンピュータ上の画像は,サイズ 640 x 480 ,8ビットカラー,などの表現がされる.

この意味は,横 640 マス,縦 480 マスの格子状に配置された(これを「解像度」という)各マスに,R(赤),G(緑),B(青)のそれぞれ2進数8桁の輝度の合成色1色があるということである.

合成色については,例えば,「赤」は,

である.ただし,16進数表記することが多く,

などと表す.同様に,緑は #00FF00,青は #0000FF である.

色の合成(混色)

#FFFFFF は何色だろうか? 

絵の具の赤と緑と青を混ぜると,,,黒っぽい色になりそうだが,,.

実は #FFFFFFは「白」である.なぜか?それは,,RGB値はディスプレイの発光であり,その光の強さだからだ.いわゆる「色」は光を受けた物体を人間が見たときの感覚であって,「色」と「光」は別ということ.

というわけで,RGB値について「色の合成」というのは本当は誤りで「光の合成」が正しいかもしれない.R,G,Bを「光の3原色」というときもある.

光を合成するので,RGB3つの原色光をどれも最大輝度で同時に光らせたらそれは眩しく,「白飛び」する.また,どれも輝度0すなわちどの原色光も光らせなかったらそれは暗く,「漆黒の闇」.よって RGB #000000 は「黒」.

では,絵具のような「色」における原色は????

色の3原色は,シアン(Cyan),マゼンタ(Magenta),イエロー(Yellow).

シアンは海の青(緑っぽい青),マゼンダは紫(青っぽい赤),イエローは黄.CMYと云われている.

一応,RGB #00FFFF がシアン光,#FF00FF がマゼンタ光,#FFFF00がイエロー光だが,色としてのシアン色,マゼンタ色,イエロー色はもっと鮮やかである.(つまり,もっと色味が豊かで,光 ≠ 色 である)

RGB光は混ぜると黒地から白色光になっていく(明るくなっていく)ので加法的であり,CMY色は混ぜると白地から混沌としていく(暗くなっていく)ので減法的である.

RGB

CMY

ちなみに,赤とシアン,緑とマゼンタ,青とイエローは補色の関係にある. RGB #FF0000 赤 に対して, RGB #00FFFF シアン のようにポジ・ネガの関係にある.

色当てゲーム

RGB値とCMY値の理解が深まったところで,色当てゲームをしよう.

color_questというパッケージを作ったので,poetryで自分のk04パッケージにインストールしてください.

> poetry new k04
> cd k04
> poetry env use py
> poetry install # k04パッケージ自身をimportできるようにする
> poetry add git+https://github.com/helmenov/color_quest # colorquestパッケージをimportできるようにする.

MacOSの人は、
最後の `poetry add` でHTTPS通信のエラーが出るかもしれない。その場合は、
ApplicationフォルダのPythonフォルダにある、`Install Certificates.command`というファイル(スクリプト)を一回だけダブルクリック実行しておくと、PythonがHTTPS通信できるようになる。

k04パッケージ開発環境フォルダをvscodeで開き,コマンドプロンプトを立ち上げ,

> poetry run color_quest

で動きます.

このプログラムは,

  • ランダムにRGB値を決めた色を背景とする図を描き,RGB値を返す
  • 以下を最大20回繰り返す.繰り返し回数をカウントする.
    1. RとGとBの値(0~255)を質問して,値をそれぞれ入力させる
    1. 入力された値と真の値との距離を計算する.
    1. もし距離が0(ピッタリ一致)であれば,繰り返しを抜ける.距離が0でなければ距離を表示し,1に戻る.
  • 繰り返しを抜けた後に,繰り返し回数を表示する.

というものです.

課題 k04 では,この色当てゲームを20回以内でクリアする補助プログラムを作ってください.

つまり,RGB値に毎回どんな値を入力すればいいかを自動計算してください.

色スポイトのような外部のサービスで,matplotlibの出力した図から,RGB値を当てるのはズルですのでやめてください.

一度RGB値を入力すると,距離が返却されます.入力したRGB値と返却された距離値の関係を元に,次に調べたいRGB値が決まるかと思います.

k04フォルダ(親)のREADME.mdに,作成したパッケージの使い方を書いてください.