1-2 「セピア・カラー処理」
モチベーション
経年劣化により退色したノスタルジックな画像を作成したい場合に使用します。
やり方
カラー画像を読み込み、読み込んだ画像のB/G/R値に対して平均値を算出します。
算出した平均値を各色チャンネルごとに係数を掛けてB/G/Rへ代入すれば実現できます。
なお、B/G/Rの平均値は、カラー画像からグレー画像を作成するときにも使用します。
プログラム
カラー画像をPILで取得し、Numpy配列化した後、RGBの色情報に対して平均値を算出します。
スライスを用いて平均値に係数を掛けた値を色情報として使用します。
#!/usr/bin/python # -*- coding: utf-8 -*- # セピアカラー処理 from PIL import Image import numpy as np from matplotlib import pylab as plt # 画像の読み込み im = np.array(Image.open('input.bmp')) print(im.shape, im.dtype) # ((640L, 960L, 3L), dtype('uint8')) # 画像の表示 plt.title("before") plt.imshow(im) plt.show() # B/G/R各チャンネルの平均値を計算 s = (0.33 * im[:,:,0] + 0.33 * im[:,:,1] + 0.33 * im[:,:,2]) # 出力画像を保存する配列を作成 im_out = im.copy() # グレー画像(B/G/Rの平均値を各色へ代入する) im_out[:,:,0] = s # Red im_out[:,:,1] = s # Green im_out[:,:,2] = s # Blue print(im_out.shape, im_out.dtype) # 画像の表示 plt.title("after gray") plt.imshow(im_out) plt.show() # セピアカラーヘ変換 im_out[:,:,0] = s # Red im_out[:,:,1] = 0.8 * s # Green im_out[:,:,2] = 0.55 * s # Blue print(im_out.shape, im_out.dtype) # 画像の表示 plt.title("after sepia") plt.imshow(im_out) plt.show() #保存 Image.fromarray(im_out).save('output.bmp')
実行結果