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

matplotlib 3D

はじめに

matplotlibの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)となり黒くなる。

fig = plt.figure(figsize=(6,6))とした場合

xyz軸の大きさが揃ったグラフとなる。

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

参考

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

コメント

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

  2. 中嶋 より:

    サボテンパイソン様

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

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

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

    • sabopy より:

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