ルックアップテーブルによる画像コントラストの補正
画素値0~255のそれぞれに対する係数をあらかじめ決めておき、画像を処理する手法があります。この係数のリストをルックアップテーブルと言い、ルックアップテーブルを用意することでOpenCVのcv2.LUT()メソッドにより画像処理が可能です。ガンマ補正とS字カーブ補正によるコントラスト補正を行います。
関連記事
使った関数・メソッド
- cv2.LUT() : 入力画素値とルックアップテーブルから出力画素値を計算
環境
準備
画像ファイルはフリー写真素材ぱくたそからダウンロードさせていただき、ファイル名’yozakura.jpg’でjupyter notebookファイル(***.ipynb)のディレクトリにフォルダ'LUT'を作りそこに保存しました。
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未満の場合は全体的に暗くなるような補正係数となります。
変換後の画像です。暗かった部分が明るくなり様子が見えるようになります。
S字補正
コード
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より大きい画素はより大きく、小さい画素はより小さく補正されます。これによりコントラストが強められます。
コントラストが協調されメリハリのある画像になります。
以下のサイトを参考にさせていただきました
Python 版 OpenCV 入門 >> (画像補正) 編
Optie研 >> Python3 & OpenCV で画像処理を学ぶ[3] 〜 トーンカーブ と LUT を理解する実装実験
【OpenCV】ルックアップテーブルを用いた階調変換【Python】