【Python・画像処理】γ変換を使って画像の明るさ調節

Python

γ(ガンマ)変換とは

画像の明るさを調節して、見やすくする技術です。

ライブラリの準備

Pythonは入ってる前提で書いていきます。
そして、画像処理で必要なライブラリが2つあるので、さくっとインストールしていきます。

  • NumPy(行列の演算とかを行う)
  • PIL(画像の読み込みと表示を行う)

NumPyのインストール

ターミナルで以下のコマンドを入力

pip install numpy

PILのインストール

同じくターミナルで以下のコマンドを入力

pip install pillow

画像を表示する

インストールしたライブラリを用いて画像を表示しましょう。

from PIL import Image

# 画像のパス
path = "./cafe.jpg" # ← 任意の画像のパスを設定する
# パスを元に画像をインポートする
img = Image.open(path)
# 画像を表示する
img.show()

適当な名前を付けて、.pyの拡張子で保存。(私はpil_test.pyという名前で保存しました)
その後、ターミナルで作成したコードを実行してみましょう。

python pil_test.py

すると、うまく実行できたら画像が出てくると思います。

実行結果

もし、この時に
FileNotFoundError: [Errno 2] No such file or directory: ‘指定した画像のパス’
のエラーが出たら、ちゃんとパスが指定できていないのでもう一度確認しましょう。

実際にγ変換を行う

γ変換は画素に以下の式をかけることで変換することができます。


$$ 変換画素 = 255( \frac{入力画素}{255})^ \frac{1}{γ} \tag{γ>0} $$

なので、γの値を変えることで明るくしたり暗くしたりできます!

image.png
γ変換のグラフ(Wikipedia)

今回は、この画像をγ変換を使ってγ=0.5、γ=1.0、γ=2.0とどのように変化するか試してみます!

「暗い画像 フリー」の画像検索結果

ソースコード

import numpy as np      # 行列の計算用
from PIL import Image   # 画像の読み込み用

###############################
# γ変換を行う関数
#
# @param float gamma 任意のγ値
###############################
def gamma_transform(gamma=1.0):

    # γが0以下の場合抜ける
    if gamma <= 0:
        print("0より大きい値にしてください。")
        return

    # 元画像を読み込む
    image = Image.open('dark.jpg')
    
    # 読み込んだ画像を配列に変換する
    image_array = np.array(image)

    #################################
    # 読み込んだ配列にガンマ変換を適用する
    #################################
    # 画像の縦のループ
    for row_index in range(len(image_array)):
        # 横一列にかけるループ
        for column_index in range(len(image_array[row_index])):
            pixel = image_array[row_index][column_index]
            # 変換画素 = 255 * ((入力画素/255) ** (1/γ))
            image_array[row_index][column_index] = 255 * ((pixel/255) ** (1/gamma))

    # γ変換をした配列を画像として保存する
    gamma_img = Image.fromarray(np.uint8(image_array))
    # 変換後の画像を表示する
    gamma_img.show()

# 実際にγ変換を行う
gamma_transform(0.5) # γ = 0.5
gamma_transform(1.0) # γ = 1.0
gamma_transform(2.0) # γ = 2.0

実行結果

γ = 0.5 の時
γ = 1.0 の時
γ = 2.0 の時

まとめ

実行結果から、、、

γ < 1 だと暗くなる
γ = 1 だと元の画像と同じ出力
γ > 1 だと明るくなる

ということがわかりました!!

コメント

タイトルとURLをコピーしました