はじめに
今回はこちらの記事を参考に、pythonでグラデーション画像を生成しようと思います。
グラデーション画像の生成
今回は二つの関数を用いて画像を生成します。
def gradation_2d_color(start, stop, size, is_horizontal):
if is_horizontal:
return np.tile(np.linspace(start, stop, size[1]), (size[0], 1))
else:
return np.tile(np.linspace(start, stop, size[0]), (size[1], 1)).T
startからstopまでの範囲をheight(またはwidth)の数だけ分割した等差数列の値を格納する長さheight(またはwidth)の1次元配列をnp.linspaceを用いて作り、これをnp.tileによりwidth(またはheight)の数だけ複製し格納した長さwidth(またはheight)の2次元配列を作ります。
・start:開始画素値
・stop:終了画素値
・size:画像サイズ[height,width]
・is_horizontal:True→水平方向にグラデーション変化/False→鉛直方向にグラデーション変化
def gradation_3d_img(start_list, stop_list, size, is_horizontal_list):
result = np.zeros((size[0], size[1], len(start_list)), dtype=np.float)
for i, (start, stop, is_horizontal) in enumerate(zip(start_list, stop_list, is_horizontal_list)):
result[:, :, i] = gradation_2d_color(start, stop, size, is_horizontal)
return result
それぞれrgbに対応するリストを渡します。第一要素がr成分、第二要素がg成分、第三要素がb成分のパラメータとなっています。
・start_list:開始画素値のリスト
・stop_list:終了画素値のリスト
・size:画像サイズのリスト
・is_horizontal_list:変化方向のリスト
これらの関数を用いてグラデーション画像を生成します。
size = [400,500] #height, width
# 水平方向に黒→白
img = gradation_3d_img([0,0,0], [255,255,255], size, [True,True,True])
img = img.astype(np.uint8)
img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)
cv2.imwrite('out.png', img)
出力画像
画像サイズを(400,500)として、他のパラメータを様々な値で試しました。
- img = gradation_3d_img([0,0,0], [255,255,255], size, [True,True,True])
- rgbの範囲:
rgb(0,0,0)
→rgb(255,255,255)
- rgbの変化方向:[→, →, →]

- img = gradation_3d_img([0,0,0], [255,255,255], size, [False,False,False])
- rgbの範囲:
rgb(0,0,0)
→rgb(255,255,255)
- rgbの変化方向:[↓, ↓, ↓]

- img = gradation_3d_img([0,255,255], [255,255,255], size, [True,True,True])
- rgbの範囲:
rgb(0,255,255)
→rgb(255,255,255)
- rgbの変化方向:[→, →, →]

- img = gradation_3d_img([255,0,0], [0,255,255], size, [True,True,True])
- rgbの範囲:
rgb(255,0,0)
→rgb(0,255,255)
- rgbの変化方向:[→, →, →]

- img = gradation_3d_img([0,0,0], [255,255,255], size, [False,True,True])
- rgbの範囲:
rgb(0,0,0)
→rgb(255,255,255)
- rgbの変化方向:[↓, →, →]

- img = gradation_3d_img([0,0,0], [255,255,255], size, [False,False,True])
- rgbの範囲:
rgb(0,0,0)
→rgb(255,255,255)
- rgbの変化方向:[↓, ↓, →]

今後の課題
今回のグラデーションは等差数列を生成するnp.linspaceを使って表現しました。
連続的に数値が変化するという意味でグラデーションを表現できていると思います。
しかし、他にもグラデーション変化を数値的に表現できるのではないかという疑問が浮かび上がってきました。次回はそれについて書こうと思います。