[matplotlib 3D] 30. voxelグラフでRGB色空間を可視化

matplotlib 3D

はじめに

この記事では、Pythonのmatplotlibライブラリを使用して、RGB色空間を3次元のvoxelグラフで可視化する方法を解説します。各ボクセルの色をRGB値に対応させることで、色空間の構造を直感的に理解できるようになります。プログラミング初心者からデータサイエンティストまで、色彩理論とデータビジュアライゼーションについて学びたい方に適した内容です。

コード

解説

def midpoints(x):
    sl = ()
    for i in range(x.ndim):
        x = (x[sl + np.index_exp[:-1]] + x[sl + np.index_exp[1:]]) / 2.0
        sl += np.index_exp[:]
    return x

中間点をもとめる関数は上記のように機能します。

r, g, b = np.indices((17, 17, 17)) / 16.0
rc = midpoints(r)

r, g, bはそれぞれ(17, 17, 17)の形状で、0〜1の値を要素として持つ配列になります。

rcはrの中間に位置する値を持つ配列です。

sphere = (rc - 0.5)**2 + (gc - 0.5)**2 + (bc - 0.5)**2 < 0.5**2

この式で球データを作成します。条件を満たす部分がTrue、それ以外はFalseとなる配列が生成されます。

colors = np.zeros(sphere.shape + (3,))

この行はsphereの形状に(3,)を追加し、colorsを(16, 16, 16, 3)の形状にします。

colors[..., 0] = rc
colors[..., 1] = gc
colors[..., 2] = bc

ここで各要素のRGB値をcolors配列に格納します。

ax.voxels(r, g, b, sphere,
          facecolors=colors,
          edgecolors=np.clip(2*colors - 0.5, 0, 1),  # brighter
          linewidth=0.5)

edgecolorsでは2*colors – 0.5の式を使用しており、計算値が0〜1の範囲を超える場合、大きい値は1に、小さい値は0に丸められます。これもRGB形式で色を指定しています。

edgecolors=np.clip(colors-1, 0, 0)の場合

すべてのedgecolorsは(0,0,0)となり黒色になるため、よりシャープな印象を与えます。

コードをダウンロード(.ipynbファイル)

参考

3D voxel / volumetric plot with RGB colors — Matplotlib 3.10.5 documentation
numpyで数値が指定範囲にいない場合に、指定範囲のmin/maxに置き換えたい : mwSoft blog

コメント

  1. […] 関数midpoints(x)は、[matplotlib 3D] 30. voxels_rgbで定義したものとおなじである。 […]

  2. 中嶋 より:

    サボテンパイソン様

    初めまして。
    中嶋と申します。

    現在卒業研究でボクセルデータを用いてマンデルバルブを表示したいと思っております。そのためまず、球体をを用いて距離関数を使用して128^3でボクセルデータを用いて表示したいと思っているのですがうまく動作しません。
    また、ボクセルデータで描画を行う際にいどのようにしたら良いのか詳しく教えていただけないでしょうか?

    ご返信お待ちしております。

    • sabopy より:

      中嶋さま
      うまく動作しない理由として、ボクセルの描写に時間がかかっているのではないかと思います。
      私の場合、64^3で15s,100^3で1minかかって表示されたので、まずはボクセルデータのサイズを小さくしてみてはいかがでしょうか。