ルックアップテーブルで画像の色味を調整する(B,G,Rチャンネルを個別に補正する)
ルックアップテーブルにより画像のB(青),G(緑),R(赤)チャンネルを個別に補正し画像の色味を調整します。
BGR3チャンネルからなる画像をcv2.split()メソッドにより3つのチャンネルに分割しいずれかのチャンネルのみに補正を行います。あらかじめガンマカーブを納めたルックアップテーブルを用意しcv2.LUT()メソッドにより各画素にルックアップテーブルを適用、特定のチャンネルのガンマ補正を行います。
用いたガンマカーブ(gamma=2)は以下のプロファイルです。補正後の値は補正前に対して全体的に高くなります。
関連記事
ルックアップテーブルで画像の彩度、明度を調整する(画像を明るく鮮やかにする)
ルックアップテーブルによる画像コントラストの補正
画像の彩度、明度を変える
環境
準備
補正に使用する画像ファイルはフリー写真素材ぱくたそからダウンロードさせていただき、jupyter notebookファイル(***.ipynb)と同じディレクトリに保存しました。
①Rチャンネルのみガンマ補正(gamma=2)し赤みを強調します。
コード
import cv2 import numpy as np img = cv2.imread('sunset.jpg') # 画像の読み出し b, g, r = cv2.split(img) # B(青),G(緑),R(赤)チャンネルごとに分割 # ルックアップテーブルの生成 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 r_lut = cv2.LUT(r, look_up_table) # Rに対してルックアップテーブル適用 img_merge = cv2.merge([b, g, r_lut]) # B,G,変換後Rをマージ cv2.imwrite('sunset_r_gamma2.jpg',img_merge) # 画像を保存
実行結果
元画像(左)と補正画像(右)を並べて表示してあります。補正により赤みが強調されました。
②Gチャンネルのみガンマ補正(gamma=2)し緑を強調します。
コード
import cv2 import numpy as np img = cv2.imread('mountain.jpg') # 画像の読み出し b, g, r = cv2.split(img) # B(青),G(緑),R(赤)チャンネルごとに分割 # ルックアップテーブルの生成 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 g_lut = cv2.LUT(g, look_up_table) # Rに対してルックアップテーブル適用 img_merge = cv2.merge([b, g_lut, r]) # B,G,変換後Rをマージ cv2.imwrite('mountain_g_gamma2.jpg',img_merge) # 画像を保存
実行結果
緑色が強調されます。
③Bチャンネルのみガンマ補正(gamma=2)し青さを強調します。
コード
import cv2 import numpy as np img = cv2.imread('sea.jpg') # 画像の読み出し b, g, r = cv2.split(img) # B(青),G(緑),R(赤)チャンネルごとに分割 # ルックアップテーブルの生成 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 b_lut = cv2.LUT(b, look_up_table) # Rに対してルックアップテーブル適用 img_merge = cv2.merge([b_lut, g, r]) # B,G,変換後Rをマージ cv2.imwrite('sea_b_gamma2.jpg',img_merge) # 画像を保存
実行結果
青さが増します。
以下のサイトを参考にさせていただきました
Pythonの文法メモ >> 【OpenCV】LUTによる画像変換