Pythonでいろいろやってみる

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

ルックアップテーブルで画像の色味を調整する(B,G,Rチャンネルを個別に補正する)

ルックアップテーブルにより画像のB(青),G(緑),R(赤)チャンネルを個別に補正し画像の色味を調整します。
BGR3チャンネルからなる画像をcv2.split()メソッドにより3つのチャンネルに分割しいずれかのチャンネルのみに補正を行います。あらかじめガンマカーブを納めたルックアップテーブルを用意しcv2.LUT()メソッドにより各画素にルックアップテーブルを適用、特定のチャンネルのガンマ補正を行います。
用いたガンマカーブ(gamma=2)は以下のプロファイルです。補正後の値は補正前に対して全体的に高くなります。
f:id:T_A_T:20201218083925p:plain

関連記事

ルックアップテーブルで画像の彩度、明度を調整する(画像を明るく鮮やかにする)
ルックアップテーブルによる画像コントラストの補正
画像の彩度、明度を変える

環境
  • windows10 home
  • Anaconda 3/ jupyter notebook 5.6.0
  • Python 3.7.0
  • OpenCV 4.0.0
準備

補正に使用する画像ファイルはフリー写真素材ぱくたそからダウンロードさせていただき、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)  # 画像を保存
実行結果

元画像(左)と補正画像(右)を並べて表示してあります。補正により赤みが強調されました。
f:id:T_A_T:20201218084749j:plain


②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)  # 画像を保存
実行結果

緑色が強調されます。
f:id:T_A_T:20201218084955j:plain


③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)  # 画像を保存
実行結果

青さが増します。
f:id:T_A_T:20201218085136j:plain

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

Pythonの文法メモ >> 【OpenCV】LUTによる画像変換

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

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