画像処理はじめました。

AI/AR/VRという近未来的な言葉に惹かれ、その技術分野に参戦するために立ち上げたブログです。日々の格闘結果を記録に残してゆこうと思います。

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')

実行結果

f:id:genetaka1810:20191027175302p:plain