Python (Pillow)でグラデーション画像を作る
PythonのNumPyとPillow (PIL)を使って、グラデーション画像を作ってみました。
目次
画像を作る手順
下記の手順でグラデーション画像を作ります。
NumPyで画素の色を表す行列を作る。
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で画像処理カテゴリの投稿
- Python (Pillow)でグラデーション画像を作る
- PythonでGIFアニメを作る(PILでファイルをつなげる編)
- PythonでOpenCVの画像データをMatplotlibで表示する
- PythonでPDFを画像に変換する(Windows10)
- PythonでPSDファイルをJPEGやPNGに変換する
- Pythonでカラー画像をグレイスケールに変換する(OpenCV編)
- Pythonでフォルダ内に同じ画像がないか検索してみた
- Pythonでマスク画像を作る方法(3選)
- Pythonで図形の外接矩形を描く(OpenCV編)
- Pythonで図形の輪郭の大きさを調べる(OpenCV編)
- Pythonで画像の余白を削除する(OpenCV編)
- Pythonで画像の余白を削除する(Pillow編)
- Pythonで画像の大きさやフォーマットを調べる(Pillow編)
- Pythonで画像の減色をする
- Pythonで画像をトリミングする(Pillow編)
- Pythonで画像を他の画像にペーストする(Pillow編)
- Pythonで画像を回転する(Pillow編)
- Pythonで画像を拡大縮小(リサイズ)する(Pillow編)
- Pythonで画像を読み込み、表示し、保存する(OpenCV編)
- Pythonで画像を読み込み、表示し、保存する(Pillow編)
- Pythonで画像を2値化する(OpenCV編)
- Pythonで記号の輪郭を検出する(OpenCV編)
- PythonとOpenCVで画像をグレースケールに変換してみた
- PythonとOpenCVで画像をネガポジ反転してみた