特定チャンネルをガンマ補正し画像の色味を変える
画素値0~255のそれぞれに対する係数をあらかじめ決めておき、画像を処理する手法があります。この係数のリストをルックアップテーブルと言い、ルックアップテーブルを用意することでOpenCVのcv2.LUT()メソッドにより画像処理が可能です。
特定のチャンネル(BGR)のみこの処理を行うことで特定のチャンネルを強調したり、逆に弱くしたりでき、画像の色味を変えられます。
関連記事
ルックアップテーブルによる画像コントラストの補正
画像の彩度、明度を変える
使った関数・メソッド
- cv2.LUT() : 入力画素値とルックアップテーブルから出力画素値を計算
環境
準備
画像ファイルはフリー写真素材ぱくたそからダウンロードさせていただき、ファイル名’harajyuku.jpg’でjupyter notebookファイル(***.ipynb)のディレクトリにフォルダ'LUT'を作りそこに保存しました。
harajyuku.jpg
コード
青(チャンネルB)をガンマ補正により強調します。
img_lut[:,:,0] = cv2.LUT(img[:,:,0], look_up_table)
とすることでndarrayのチャンネルBのみ補正します。
% matplotlib inline import cv2 import numpy as np import math import matplotlib.pyplot as plt # 画像の読み出し img = cv2.imread('LUT/harajyuku.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にコピー img_lut = img # チャンネルB(G,R)のみルックアップテーブルを適用しガンマ補正 img_lut[:,:,0] = cv2.LUT(img[:,:,0], 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_LUT') plt.show()
実行結果
ルックアップテーブルが表示されます。
RGB値の小さい画素にが特に大きくなるような補正がされます。つまり暗いところが明るくなります。これにより補正をかけた青(チャンネルB)のみを強調できます。
img_lut[:,:,1] = cv2.LUT(img[:,:,1], look_up_table)
とすることで緑(チャンネルG )を強調できます。
img_lut[:,:,2] = cv2.LUT(img[:,:,2], look_up_table)
とすることで赤(チャンネルR )を強調できます。
以下のサイトを参考にさせていただきました
Python 版 OpenCV 入門 >> (画像補正) 編
Optie研 >> Python3 & OpenCV で画像処理を学ぶ[3] 〜 トーンカーブ と LUT を理解する実装実験
【OpenCV】ルックアップテーブルを用いた階調変換【Python】