Pythonでいろいろやってみる

Pythonを使った画像処理や機械学習などの簡単なプログラムを載せています。

ルックアップテーブルによる画像コントラストの補正

画素値0~255のそれぞれに対する係数をあらかじめ決めておき、画像を処理する手法があります。この係数のリストをルックアップテーブルと言い、ルックアップテーブルを用意することでOpenCVのcv2.LUT()メソッドにより画像処理が可能です。ガンマ補正とS字カーブ補正によるコントラスト補正を行います。

関連記事

画像の彩度、明度を変える

使った関数・メソッド
  • cv2.LUT() : 入力画素値とルックアップテーブルから出力画素値を計算
環境
  • windows10 home
  • Anaconda 3/ jupyter notebook 5.6.0
  • Python 3.7.0
  • OpenCV 4.0.0
準備

画像ファイルはフリー写真素材ぱくたそからダウンロードさせていただき、ファイル名’yozakura.jpg’でjupyter notebookファイル(***.ipynb)のディレクトリにフォルダ'LUT'を作りそこに保存しました。
f:id:T_A_T:20190517220120j:plain
yozakura.jpg


ガンマ補正


コード
import cv2
import numpy as np
import math 
import matplotlib.pyplot as plt

# 画像の読み出し
img = cv2.imread('LUT/yozakura.jpg')  

# ルックアップテーブルの生成
gamma = 2
look_up_table = np.zeros((256,1),dtype=np.uint8)
for i in range(256):
    look_up_table[i][0] = (i/255)**(1.0/gamma)*255

# 変換後の画像生成、保存
img_lut = cv2.LUT(img, look_up_table)
cv2.imwrite('LUT/LUT.jpg',img_lut)

# ルックアップテーブルのプロット
plt_x = np.arange(256)
plt_y = look_up_table[0:256]
plt.plot(plt_x,plt_y)
plt.xlabel('RGB')
plt.ylabel('RGB_LTU')
plt.show() 

実行結果

ルックアップテーブルが表示されます。RGB値の小さい画素にが特に大きくなるような補正がされます。つまり暗いところが明るくなります。カーブ形状はガンマ値により変わり、ガンマ値が1未満の場合は全体的に暗くなるような補正係数となります。 f:id:T_A_T:20190517220230p:plain
変換後の画像です。暗かった部分が明るくなり様子が見えるようになります。 f:id:T_A_T:20190517220006j:plain


S字補正


f:id:T_A_T:20190517222735j:plain

コード
import cv2
import numpy as np
import math 
import matplotlib.pyplot as plt

# 画像の読み出し
img = cv2.imread('LUT/Venezia.jpg')  

# ルックアップテーブルの生成
look_up_table = np.zeros((256,1),dtype=np.uint8)
for i in range(256):
    look_up_table[i][0] = 255*(math.sin(math.pi*(i/255-0.5))+1)/2

# 変換後の画像生成、保存
img_lut = cv2.LUT(img, look_up_table)
cv2.imwrite('LUT/LUT2.jpg',img_lut)

# ルックアップテーブルのプロット
plt_x = np.arange(256)
plt_y = look_up_table[0:256]
plt.plot(plt_x,plt_y)
plt.xlabel('RGB')
plt.ylabel('RGB_LTU')
plt.show() 
実行結果

輝度128より大きい画素はより大きく、小さい画素はより小さく補正されます。これによりコントラストが強められます。
f:id:T_A_T:20190517222652p:plain
コントラストが協調されメリハリのある画像になります。
f:id:T_A_T:20190517222719j:plain

以下のサイトを参考にさせていただきました

Python 版 OpenCV 入門 >> (画像補正) 編
Optie研 >> Python3 & OpenCV で画像処理を学ぶ[3] 〜 トーンカーブ と LUT を理解する実装実験
【OpenCV】ルックアップテーブルを用いた階調変換【Python】

ブログランキングに参加しています

にほんブログ村 IT技術ブログへ
にほんブログ村