Python (Pillow)でグラデーション画像を作る

PythonのNumPyとPillow (PIL)を使って、グラデーション画像を作ってみました。

目次

  1. 画像を作る手順
  2. 白黒のグラデーション
  3. カラーのグラデーション

画像を作る手順

下記の手順でグラデーション画像を作ります。

  1. NumPyで画素の色を表す行列を作る。
  2. Pillowのfromarrayメソッドで画像に変換する。

白黒のグラデーション

Pillowの画像モードのうちLモードでグラデーション画像を作ります。Lモードは、ピクセルあたり8ビットの画像です。

import numpy as np
from PIL import Image

line_data = np.arange(256)
mat = np.tile(line_data, (256,1))

im = Image.fromarray(np.uint8(mat), 'L')
im.save('out.png')

np.arange(256)メソッドで、要素が0~255までの1次元の行列を作ります。

np.tileメソッドで1次元の配列を並べて2次元の配列を作ります。この行列の各要素が、画像の各画素の色(白さ、黒さ)を表します。

np.uint8メソッドは、uint8にキャストするメソッドです。

Image.fromarrayメソッドに作った行列を指定してPillowの画像オブジェクトに変換します。2つめの引数にモードを指定します。8ビット白黒画像なので、Lを指定します。

Pillowのsaveメソッドは、ファイル名に拡張子を指定するとその拡張子に合わせたフォーマットで保存します。また、画像オブジェクトのモードがLの場合は、8ビット白黒のPNGフォーマットで出力します。

作成した画像はこのようになります。

白黒グラデーション画像

カラーのグラデーション

PCで画像というとRGBでの色指定をすることが多いのですが、今回はHSVで色指定をします。

PillowのRGBモードやHSVモードは各色8 bitで表します。ですから、行列の要素の型はuint8にします。

import numpy as np
from PIL import Image

line_data = np.arange(256)
hue = np.tile(line_data, (256,1))
sat = np.transpose(hue)
val = np.full_like(hue, 255)

mat = np.stack([hue, sat, val], 2)

im = Image.fromarray(np.uint8(mat), 'HSV')
#im.show()  # 画像を表示する場合
im_rgb = im.convert('RGB')
im_rgb.save('out1.png')

np.arange(256)メソッドで、要素が0~255までの1次元の行列を作ります。

np.tileメソッドで1次元の配列を並べて2次元の配列を作ります。今回はこれをHue(色相)にすることにしました。

np.transposeメソッドは行列を転置するメソッドです。HueとSaturation(彩度)のグラデーションの方向を変えたかったので、Saturationの行列はHueの行列を転置して作ることにしました。

np.full_likeメソッドは、指定した行列と同じサイズで特定の値の行列を作るメソッドです。Value(明度)を一定にすることで、同じ明るさでのグラデーション画像にします。

np.stackは行列を結合するメソッドです。HSVモードにする場合は、Hue、Saturation、Valueの順番に行列を並べます。

np.uint8メソッドは、uint8にキャストするメソッドです。

Image.fromarrayメソッドに作った行列を指定してPillowの画像オブジェクトに変換します。2つめの引数にモードを指定します。RGBの場合は'RGB'、HSVの場合は'HSV'です。

作成した画像オブジェクトをPNGファイルに保存する場合は、画像のモードをRGBに変更する必要があります。convertメソッドがその役割をしています。

作成した画像はこのようになります。

カラーグラデーション画像

広告

Pythonで画像処理カテゴリの投稿