グラフィックスによる色の表現

[Maple Plot]

人間は色を感じることができます。色は一体何色あるのでしょうか?

物理的には色は光の波長に対応しています。人間がみることのできる光は大体400ナノメーロルから700ナノメートルの波長です。

最も良く感じる波長帯は550ナノメートルの緑色の付近です。

波長550ナノメートルの光と551ナノメートルの光は同じ緑ですが違う色と考えとれます。もっと厳密にいうと551.01ナノメートルの光も違う色といえます。

連続的に存在しているのですから無限に色が存在することになります。

これらのわずかな波長の差の色の差は人間には区別できません。

不思議なことにテレビではRGBの三色だけで画像を送っていますが充分色を表現できています。

どうして3色だけでほとんどの色が表されているのでしょうか。

もとの400ナノメートルから700ナノメートルの波長範囲は一体どこにいったのでしょうか?

青色よりも短い波長の紫が表現されているのはおかしいと思うのは私だけでしょうか。

人間の目は虹の7色ははっきり区別がつくわけですから波長の区別はある程度知覚できています。

どちらにしろ色は多くの情報を知らせることができます。

またRGBの三色だけで充分表現できているのも事実です。

コンピュータの画面上の色は現在65000色以上の表現能力があります。

もっともこれは人間の色の分解能を超えていると思うのですが。

人間は暗い光ではとくに色の区別がつきにくくなります。

紫色がRGBでごまかされるのは多分そのためでしょう。

Maple ではグラフィックス表示で簡単に色を指定することができます。

次に示しているのはRGB指定による色の表現です。RGBそれぞれの割合を指定することで

色を表現します。

>    restart;

>    with(plots):

Warning, the name changecoords has been redefined

>    c:=COLOR(RGB,0.2,0.5,0.8);

c := COLOR(RGB,.2,.5,.8)

>    polygonplot([[0,0],[0,1],[1,1],[1,0]],color=c);

[Maple Plot]

>    p1:=polygonplot([[0,0],[0,1],[1,1],[1,0]],color=COLOR(RGB,0,0,0)):

>    p2:=polygonplot([[0,0],[0,1],[1,1],[1,0]],color=COLOR(RGB,1,1,1)):

>    display(array(1..2,[p1,p2]));

[Maple Plot]

このようにRGBすべて0だと黒、すべて1だとしろになります。

>    r:=1;g:=1;b:=0.1;
c:=COLOR(RGB,r,g,b):
p1:=polygonplot([[0,0],[0,1],[2,1],[2,0]],color=c):
p_r:=polygonplot([[3,0],[3,r],[3.5,r],[3.5,0]],color=red):
p_g:=polygonplot([[3.5,0],[3.5,g],[4,g],[4,0]],color=green):
p_b:=polygonplot([[4,0],[4,b],[4.5,b],[4.5,0]],color=blue):
display(p1,p_r,p_g,p_b,axes=none);

r := 1

g := 1

b := .1

[Maple Plot]

rとgを足すと黄色になります。これに青を足すと白になります。これが補色の関係で青の補色は黄色です。

右の棒グラフでRGBの割合を同時に表示しています。わかりやすいように青を少し残しています。

>    r:=1;g:=0.1;b:=1.;
c:=COLOR(RGB,r,g,b):
p1:=polygonplot([[0,0],[0,1],[2,1],[2,0]],color=c):
p_r:=polygonplot([[3,0],[3,r],[3.5,r],[3.5,0]],color=red):
p_g:=polygonplot([[3.5,0],[3.5,g],[4,g],[4,0]],color=green):
p_b:=polygonplot([[4,0],[4,b],[4.5,b],[4.5,0]],color=blue):
display(p1,p_r,p_g,p_b,axes=none);

r := 1

g := .1

b := 1.

[Maple Plot]

同様にこれは緑の補色です。この色をマゼンタと呼びます。赤と青を足すとこの色になります。

>    r:=0.1;g:=1;b:=1;
c:=COLOR(RGB,r,g,b):
p1:=polygonplot([[0,0],[0,1],[2,1],[2,0]],color=c):
p_r:=polygonplot([[3,0],[3,r],[3.5,r],[3.5,0]],color=red):
p_g:=polygonplot([[3.5,0],[3.5,g],[4,g],[4,0]],color=green):
p_b:=polygonplot([[4,0],[4,b],[4.5,b],[4.5,0]],color=blue):
display(p1,p_r,p_g,p_b,axes=none);

r := .1

g := 1

b := 1

[Maple Plot]

同様に赤の補色のシアンです。緑と青を足した色です。

色のアニメーションと色立体

RGBの割合を周期的に変化させアニメーションで表示してみましょう。

>    p:=NULL:
for t from 0 to evalf(2*Pi) by 0.1 do
r:=sin(3*t)/2+0.5;
g:=sin(4*t)/2+0.5;
b:=sin(5*t)/2+0.5;
c:=COLOR(RGB,r,g,b);
p1:=polygonplot([[0,0],[0,1],[2,1],[2,0]],color=c);
p_r:=polygonplot([[3,0],[3,r],[3.5,r],[3.5,0]],color=red);
p_g:=polygonplot([[3.5,0],[3.5,g],[4,g],[4,0]],color=green);
p_b:=polygonplot([[4,0],[4,b],[4.5,b],[4.5,0]],color=blue);
p:=p,display(p1,p_r,p_g,p_b);
od:
display(p,insequence=true,axes=none);

[Maple Plot]

右に表示している棒グラフがその色のRGBによるスペクトラムです。

R、G、Bをx、y、z軸にとりその色を立方体で表示してみましょう。このように色を立体的に配置したものを色空間と呼びます。

>    with(plottools):

Warning, the assigned name arrow now has a global binding

>    p:=NULL:

>    for r from 0 to 1 by 0.2 do
for g from 0 to 1 by 0.2 do
for b from 0 to 1 by 0.2 do
c:=COLOR(RGB,r,g,b);
p:=p,display(cuboid([r,g,b],[r+0.08,g+0.08,b+0.08],color=c));
od:od:od:

>    pp:=NULL:DO:=evalf(Pi/180):m:=90:
for k to m by 4 do
pp:=pp,display(p,orientation=[k,30]);
od:

>    display(pp,insequence=true,scaling=constrained);

[Maple Plot]

色度と色相

3次元的な表現では色の分布が一目で分かりにくいので2次元的に表現する多くの方式があります。国際照明委員会(CIE)がそのような表色方式の標準化を制定しています。

>    p:=NULL:delta:=0.02:

>    for r from 0 to 1 by 0.1 do
for g from 0 to 1 by 0.1 do
for b from 0 to 1 by 0.1 do
c:=COLOR(RGB,r,g,b);

X:=0.49*r+0.31*g+0.2*b;
Y:=0.17697*r+0.8124*g+0.01063*b;
Z:=0.01*g+0.99*b;
if X+Y+Z  > 1.3 then
x:=X/(X+Y+Z);
y:=Y/(X+Y+Z);
p:=p,polygonplot([[x,y],[x,y+delta],[x+delta,y+delta],[x+delta,y]],color=c,style=patchnogrid);
fi;
od:od:od:
display(p);

[Maple Plot]

>    p:=NULL:delta:=0.02:

>    for r from 0 to 1 by 0.1 do
for g from 0 to 1 by 0.1 do
for b from 0 to 1 by 0.1 do
c:=COLOR(RGB,r,g,b);
X:=0.49*r+0.31*g+0.2*b;
Y:=0.17697*r+0.8124*g+0.01063*b;
Z:=0.01*g+0.99*b;
if X+Y+Z  > 1.3 then
x:=X/(X+Y+Z);
y:=Y/(X+Y+Z);
u:=4*x/(-2*x+12*y+3);
v:=9*y/(-2*x+12*y+3);
p:=p,polygonplot([[u,v],[u,v+delta],[u+delta,v+delta],[u+delta,v]],color=c,style=patchnogrid);
fi;
od:od:od:
display(p);

[Maple Plot]

>    p:=NULL:delta:=0.02:

>    for r from 0 to 1 by 0.1 do
for g from 0 to 1 by 0.1 do
for b from 0 to 1 by 0.1 do
c:=COLOR(RGB,r,g,b);
X:=0.49*r+0.31*g+0.2*b;
Y:=0.17697*r+0.8124*g+0.01063*b;
Z:=0.01*g+0.99*b;
if X+Y+Z  > 1.3 then
x:=X/(X+Y+Z);
y:=Y/(X+Y+Z);
u:=4*x/(-2*x+12*y+3);
v:=9*y/(-2*x+12*y+3);
p:=p,polygonplot([[u,v],[u,v+delta],[u+delta,v+delta],[u+delta,v]],color=c,style=patchnogrid);
fi;
od:od:od:
display(p);

[Maple Plot]

MapleVでは色相(HUE)でも色を指定することができます。色を円周上に配置したものを色相環と呼んでいます。

その色の方向の角度で射ろを表現することができます。MapleVではこの360度の範囲を0から1で表現します。

以下は色相環を表示しています。

>    p:=NULL:delta:=0.1:
for hue from 0 to 1 by 0.02 do
c:=COLOR(HUE,hue);
x:=cos(2*Pi*hue);y:=sin(2*Pi*hue);
p:=p,polygonplot([[x,y],[x,y+delta],[x+delta,y+delta],[x+delta,y]],color=c);
od:
display(p,scaling=constrained);

[Maple Plot]

Maple での色の表現

Maple ではグラフィックス表現でcolor関数が指定でき、もうひとつの情報を同時に表現することができます。

次のように3次元プロットにもう一つの関数を表示できます。

>    x:='x';y:='y';

x := 'x'

y := 'y'

>    f:=(x,y)->cos(x)*y;

f := proc (x, y) options operator, arrow; cos(x)*y end proc

>    g:=(x,y)->sin(x+y^2);

g := proc (x, y) options operator, arrow; sin(x+y^2) end proc

>    plot3d(f(x,y),x=-2..2,y=-2..2,color=g(x,y));

[Maple Plot]

色は関数gを表現しています。次のようにRGB3色で表現することもできます。

>    plot3d(f(x,y),x=-2..2,y=-2..2,color=[0,g(x,y),g(x,y)]);

[Maple Plot]

次のようにトーラス上の関数を色で表現することもできます。

>    r1:=5:r2:=1:u:='u':v:='v':
fx:=(u,v)->(r1+r2*cos(v))*cos(u):
fy:=(u,v)->(r1+r2*cos(v))*sin(u):
fz:=(u,v)->r2*sin(v):
g:=(u,v)->sin(u+v):
plot3d([fx(u,v),fy(u,v),fz(u,v)],u=0..eval(2*Pi),v=0..eval(2*Pi),color=g(u,v),scaling=constrained,style=patchnogrid);

[Maple Plot]

次のように関数gの変化を色でアニメーションすることも可能です

>    f:=(x,y)->cos(x)*y;

f := proc (x, y) options operator, arrow; cos(x)*y end proc

>    g:=(x,y,t)->(x-(2*t-1)^2)^2+(y-2*t)^2;

g := proc (x, y, t) options operator, arrow; (x-(2*t-1)^2)^2+(y-2*t)^2 end proc

>    p:=NULL:

for t from 0 to 1 by 0.1 do
p:=p,plot3d(f(x,y),x=-5..5,y=-5..5,color=g(x,y,t));
od:
display(p,insequence=true,style=patchnogrid);

[Maple Plot]

もちろんトーラス上でもアニメーションできます。

>    g:=(u,v,t)->sin(u+t)+sin(v+t);
p:=NULL:
for t from 0 to 1 by 0.1 do
p:=p,plot3d([fx(u,v),fy(u,v),fz(u,v)],u=0..eval(2*Pi),v=0..eval(2*Pi),color=g(u,v,t));
od:
display(p,insequence=true,style=patchnogrid,scaling=constrained);

g := proc (u, v, t) options operator, arrow; sin(u+t)+sin(v+t) end proc

[Maple Plot]

>   

色は明らかにもう一つの情報を表現してくれます。