ドキュメンテーション センター

  • 評価版
  • 製品アップデート

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

メッシュと表面プロットのカラーリング

カラーリングの方法

これらのプロットに色を適用する方法をコントロールすることにより、表面プロットの情報を強調することができます。MATLAB® は、特定のデータ値を明示的に指定した色にマッピングするか、または、データのすべての範囲を colormap と呼ばれる事前設定したカラー範囲にマッピングします。

3 つのカラーリング手法があります。

  • インデックス付きカラー - 直接法とスケーリング法によるカラー マッピング — MATLAB は、Figure のカラーマップ内のインデックスを各データ点に割り当てることにより表面プロットを色付けします。MATLAB がこれらの色を適用する方法は、使用するシェーディングのタイプ (faceted、flat、interpolated) にも依存します。

  • トゥルーカラー表面 - 表面プロットに付ける色 (RGB 3 原色など) を明示的に指定します。MATLAB がこれらの色を適用する方法は、使用するシェーディングのタイプ (faceted、flat、interpolated) にも依存します。正確にレンダリングするには、トゥルーカラーは、24 ビット表示のコンピューターを必要とします。ただし、MATLAB は、インデックス付きシステム上でトゥルーカラーをシミュレーションします。シェーディングのタイプに関する情報は、shading コマンドを参照してください。

  • テクスチャのマッピング - 3 次元の表面に 2 次元のイメージをマッピングします。

カラー データのタイプ

指定するカラー データ型 (単一値 または RGB3 要素) は、MATLAB によってカラー データがどのように解釈されるかを決定します。表面プロットを作成するときに、次のことを行えます。

  • 明示的なカラー データを用意していない場合、MATLAB は z データからカラーマップ インデックスを作成します。

  • z データに、同じサイズをもつカラー データ配列を指定して、インデックス付きカラーにカラー データ配列を使用します。

  • m x n x 3 のサイズのカラー データ配列を使用して、mn 列のデータ配列 z 内の各要素に対して、RGB 要素を定義し、トゥルーカラーに使用します。

カラーマップ

各 MATLAB Figure ウィンドウはそれに関連したカラーマップをもっています。カラーマップは、単に 3 列の行列で、その長さは定義するカラー数と等しいものです。行列の各行は 0 ~ 1 の範囲の 3 つの値を使用して、特定の色を定義します。これらの値で、RGB の要素 (赤、緑、青の表示色の強度) が決まります。

関数 colormap は、引数を設定しない場合、現在の Figure のカラーマップを出力します。たとえば、MATLAB の hsv カラーマップは既定では 64 色で構成されており、33 番目の色はシアンです。

colormap hsv
cm = colormap;
cm(33,:)
ans = 
      0  1  1

RGB カラーの要素

次の表は、代表的な RGB カラーの定義を示しています。

0

0

0

1

1

1

1

0

0

0

1

0

0

0

1

1

1

0

1

0

1

赤紫

0

1

1

シアン

0.5

0.5

0.5

グレー

0.5

0

0

ダークレッド

1

0.62

0.40

赤銅色

0.49

1

0.83

アクアマリン

カラーマップは MATLAB 配列演算を使用して作成できます。または、hsvhotcoolsummergray など、便利なマップを作成する関数の 1 つを使用することもできます。各関数は、結果のマップ内の行数を指定するオプションのパラメーターをもつことができます。

たとえば、次のようになります。

hot(m)

は、m 行 3 列の行列の行が、マップの RGB 強度を指定するもので、黒から赤、橙、黄、白に変化します。

カラーマップ長を指定しない場合は、MATLAB が現在のカラーマップと同じ長さでカラーマップを作成します。既定のカラーマップは、jet(64) です。

複数の Figure ウィンドウのそれぞれで長いカラーマップ (64 色以上) を使用する場合は、アクティブなウィンドウが変わるので、オペレーティング システムで使用するカラールック アップ テーブルを切り替えなければならないことがあります。

カラーマップの表示

関数 colorbar は、現在のカラーマップを Figure ウィンドウのグラフに沿って垂直または水平に表示します。たとえば、ステートメント

[x,y] = meshgrid([-2:.2:2]);
Z = x.*exp(-x.^2-y.^2);
surf(x,y,Z,gradient(Z))
colorbar

は、表面プロットとカラーマップに対応する色の垂直ストリップを作成します。軸のラベルに相当する目盛の付いたカラー バーは、データの値に対応する色を示します。

インデックス付きカラー - 直接法とスケーリング法によるカラー マッピング

MATLAB は異なる 2 つの方法、直説法とスケーリング法で、インデックス付きカラー データをカラーマップにマッピングします。

直説法

直接のマッピングは、カラー データをカラーマップ内のインデックスとして直接使用します。たとえば、1 の点の値はカラーマップの最初の色で、2 は 2 番目の色、などのように使用します。カラー データが整数でない場合、MATLAB はゼロ方向に丸めます。カラーマップ内のカラー数より大きい値は、カラーマップ内の最後の色 (すなわち length(colormap) 数) と等しくします。1 より小さい値は、1 に設定されます。

スケーリング法のマッピング

スケーリング法を使ったマッピングは、2 要素ベクトル [cmin cmax] (これらは、コマンド caxis を使用して設定します) を使用して、カラー データの Figure カラーマップへのマッピングをコントロールします。cmin は、データ値をカラーマップ内の最初の色にマッピングし、cmax は、カラーマップの最後の色にマッピングします。その間のデータ値は、2 番目の色から、最後から 2 つ目の色まで、次の式を使用して線形に変換されます。

colormap_index = fix((color_data-cmin)/(cmax-cmin)*cm_length)+1

cm_length は、カラーマップの長さです。

既定の設定では、MATLAB は cmincmax を Axes 内のすべてのグラフィックス オブジェクトのカラー データの範囲に広げたものです。ただし、これらの範囲を任意の範囲に設定することができます。これにより、1 つの Figure ウィンドウ内に複数の Axes を表すことができ、互いにカラーマップの異なる部分を使うことができます。色の範囲を使用例については、『MATLAB グラフィックス』ドキュメンテーションの「「色の範囲の計算」」を参照してください。

既定の設定で、MATLAB はスケーリング法のマッピングを使用します。直説法を使用する場合は、プロットを作成するときに、切り替えを行ってください。以下に例を示します。

surf(Z,C,'CDataMapping','direct')

カラー データの指定情報は、surface を参照してください。

インデックス付きカラーの指定

単一の行列引数を使用して、表面プロットを作成するときに、たとえば surf(Z) の引数 Z が表面の高さと色を共に指定しているとします。MATLAB は、Z を現在のカラーマップ内のインデックスを得るために変換します。

2 つの行列引数を使用して、ステートメント

surf(Z,C)

は、2 番目の引数を使用して色を独立に指定します。

例 - 表面の曲率を色にマッピングする

表面プロットのラプラス演算子は、その曲率に関連しています。これは、i^2 + j^2 のような関数型に対して正、-(i^2 + j^2) に対して負です。関数 del2 を使用して、任意の行列の離散ラプラス演算子を計算します。たとえば、del2 を使用して、peaks から出力されるデータに対して、色を決定します。

P = peaks(40);
C = del2(P);
surf(P,C)
colormap hot

ラプラス演算子をデータに適用して、作成される色配列は、同様な曲率をもつ部分を同じ色で描くので、有効なものになります。

この表面カラーリングを次のステートメントで作成するものと比較します。

surf(P)
colormap hot

は、同じカラーマップを使用して、同じような z 値 (x-y 平面上にある高さ) をもつ領域を同じ色でマッピングしています。

カラーマップの変更

カラーマップは行列なので、他の配列と同じように操作できます。関数 brighten は、この事実を利用して、色の強度を増加または減少させます。rgbplot を使用して、カラーマップの R、G、B 要素の値をプロットすると、brighten の効果を示すことができます。

NTSC カラー エンコード

テレビ放送の輝度信号では、NTSC (National Television System Committee) 方式のカラー エンコード法が使用されています。

b = .30*red + .59*green + .11*blue 
  = sum(diag([.30 .59 .11])*map')';

非線形のグレースケール マップを使用して、

colormap([b b b])

は、効率的にカラー イメージを NTSC の白黒の相当値に変換します。

トゥルーカラー表面

24 ビットのコンピューター システムは、1600 万色 (224 色) を超える色を表示できる能力があります。一方、8 ビット ディスプレイでは、256 色です。この機能を使用して、カラー データを直接 RGB 値として定義すると、数値をカラーマップ内の位置にマッピングする手順を省くことができます。

m x n x 3 配列を使用してトゥルーカラーを指定します。ここで、Z のサイズは mn 列です。

たとえば、ステートメント

Z = peaks(25); 
C(:,:,1) = rand(25);
C(:,:,2) = rand(25);
C(:,:,3) = rand(25);
surf(Z,C)

は、ランダムなカラーリングをもつ peaks 行列のプロットを作成します。

インデックス付きカラーとして、表面プロパティを設定することができます。

surf(Z,C,'FaceColor','interp','FaceLighting','phong')
camlight right

トゥルーカラー用のレンダリング法

MATLAB では常に OpenGL® または Z-buffer レンダリング法を使用して、トゥルーカラーが表示されます。Figure の RendererMode プロパティが auto に設定されている場合は、トゥルーカラー データを指定すると MATLAB で Renderer プロパティの値が自動的に zbuffer に切り替わります。

明示的に Rendererpainters (RendererModemanual に設定) に設定し、トゥルーカラーを使用して、Image、Patch、Surface オブジェクトを定義しようとすると、MATLAB は、警告を出力し、オブジェクトのレンダリングを行いません。

これらのオブジェクトのトゥルーカラーを定義するための詳細は、関数 imagepatchsurface を参照してください。

テクスチャのマッピング

テクスチャ マッピングは、表面プロットに適合するようにカラー データを変換することによって、2 次元イメージを 3 次元表面に写像する技術です。この技術によって、凹凸や木目などの "テクスチャ" を表面に付けることができます。このような表面を作成するために幾何学的なモデリングは必要ありません。カラー データは、スキャンした写真など任意のイメージでも構いません。

テクスチャ マッピングにより、カラー データ配列の次元を、表面プロットを定義するデータとは異なるものとすることができます。すなわち、任意のサイズのイメージを任意の表面に適用することができます。MATLAB は、テクスチャのカラー データを表面全体に写像できるように内挿します。

例 - 表面にテクスチャをマッピングする

この例では、関数 sphere を使用して球面を作成し、宇宙から撮影した地球のイメージでテクスチャ マップが行われます。この例では、地球のイメージは半面だけなので、残りのイメージ データに 1 を付加し、半球にイメージをマッピングします。イメージ データは 257 行 250 列の行列です。したがって、要素がすべて 1 である 257 行 125 列の 2 つの行列を、イメージ データの左右に付加することで、3 つの行列を連結します。

テクスチャ マッピングを使用するには、FaceColor texturemap に設定し、 表面の CData にイメージを割り当てます。

load earth % Load image data, X, and colormap, map
sphere; h = findobj('Type','surface');
hemisphere = [ones(257,125),... 
              X,... 
              ones(257,125)];
set(h,'CData',flipud(hemisphere),'FaceColor','texturemap')
colormap(map)
axis equal
view([90 0])

set(gca,'CameraViewAngleMode','manual')
view([65 30])

この情報は役に立ちましたか?