HSB円柱モデル

関連


円柱モデル

HSVやHSBの概念を理解しやすくするために、以下のような円柱モデルがよく用いられます。

  • 円柱の垂直軸(高さ): 明度(Value/Brightness)を示し、下から上に行くほど明るくなります。

  • 円柱の周囲: 色相(Hue)を示し、円を一周すると0度から360度までの色相が表示されます。

  • 円柱の半径方向: 彩度(Saturation)を示し、中心から外側に行くほど鮮やかになります。

このモデルは、色の三次元的な関係を視覚的に理解するのに役立ちます。


import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import hsv_to_rgb
from mpl_toolkits.mplot3d import Axes3D

# HSV円柱モデルの作成
h = np.linspace(0, 1, 90)  # 色相 (Hue)
s = np.linspace(0, 1, 30)  # 彩度 (Saturation)
v = np.linspace(0, 1, 30)  # 明度 (Value)

H, S, V = np.meshgrid(h, s, v, indexing='ij')

# HSV色空間をRGBに変換
HSV = np.stack((H, S, V), axis=-1)
RGB = hsv_to_rgb(HSV)

# 極座標変換
X = S * np.cos(H * 2 * np.pi)
Y = S * np.sin(H * 2 * np.pi)
Z = V

# プロット設定
fig = plt.figure(figsize=(10, 10))
ax = fig.add_subplot(111, projection='3d')

# カラーマップの作成
colors = RGB.reshape(-1, 3)
ax.scatter(X.flatten(), Y.flatten(), Z.flatten(), facecolors=colors, marker='.', s=1)

ax.set_xlabel('Saturation (cos(Hue))')
ax.set_ylabel('Saturation (sin(Hue))')
ax.set_zlabel('Value')
ax.set_title('HSV Color Cylinder')

plt.show()



プロット数が増えると相応に重い。


import numpy as np
import matplotlib.pyplot as plt
import matplotlib.colors as mcolors

def plot_hs_circle():
    size = 300  # 画像のサイズ
    radius = size // 2

    # 円形マスクを作成
    y, x = np.ogrid[-radius:radius, -radius:radius]
    mask = x**2 + y**2 <= radius**2

    # 色相と彩度を計算
    theta = np.arctan2(y, x)
    theta[theta < 0] += 2 * np.pi  # 0から2πの範囲に変換
    r = np.sqrt(x**2 + y**2) / radius

    # HSVからRGBに変換
    h = theta / (2 * np.pi)
    s = r
    v = np.ones_like(h)
    hsv = np.dstack((h, s, v))
    rgb = mcolors.hsv_to_rgb(hsv)

    # 円形領域のみ色を適用
    circle_rgb = np.zeros((size, size, 3))
    circle_rgb[radius-mask.shape[0]//2:radius+mask.shape[0]//2, radius-mask.shape[1]//2:radius+mask.shape[1]//2][mask] = rgb[mask]

    # 画像を表示
    plt.imshow(circle_rgb, extent=[-1, 1, -1, 1])
    plt.axis('off')  # 軸を非表示にする
    plt.show()

plot_hs_circle()


スペクトル

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Spectral Gradient on Canvas</title>
    <style>
        canvas {
            border: 1px solid black;
            display: block;
            margin: 50px auto;
        }
    </style>
</head>
<body>

<canvas id="myCanvas" width="500" height="100"></canvas>

<script>
    const canvas = document.getElementById("myCanvas");
    const ctx = canvas.getContext("2d");

    // Create a linear gradient
    const gradient = ctx.createLinearGradient(0, 0, canvas.width, 0);
    gradient.addColorStop(0, "red");
    gradient.addColorStop(0.15, "orange");
    gradient.addColorStop(0.33, "yellow");
    gradient.addColorStop(0.5, "green");
    gradient.addColorStop(0.66, "blue");
    gradient.addColorStop(0.82, "indigo");
    gradient.addColorStop(1, "violet");

    // Fill the rectangle with the gradient
    ctx.fillStyle = gradient;
    ctx.fillRect(0, 0, canvas.width, canvas.height);
</script>

</body>
</html>

この記事が気に入ったらサポートをしてみませんか?