Pythonでいろいろやってみる

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

特定チャンネルをガンマ補正し画像の色味を変える

画素値0~255のそれぞれに対する係数をあらかじめ決めておき、画像を処理する手法があります。この係数のリストをルックアップテーブルと言い、ルックアップテーブルを用意することでOpenCVのcv2.LUT()メソッドにより画像処理が可能です。
特定のチャンネル(BGR)のみこの処理を行うことで特定のチャンネルを強調したり、逆に弱くしたりでき、画像の色味を変えられます。

関連記事

ルックアップテーブルによる画像コントラストの補正
画像の彩度、明度を変える

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

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

f:id:T_A_T:20190613221709j:plain
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() 
実行結果

ルックアップテーブルが表示されます。
f:id:T_A_T:20190613222454p:plain
RGB値の小さい画素にが特に大きくなるような補正がされます。つまり暗いところが明るくなります。これにより補正をかけた青(チャンネルB)のみを強調できます。
f:id:T_A_T:20190613222355j:plain

img_lut[:,:,1] = cv2.LUT(img[:,:,1], look_up_table)
とすることで緑(チャンネルG )を強調できます。 f:id:T_A_T:20190613222652j:plain

img_lut[:,:,2] = cv2.LUT(img[:,:,2], look_up_table)
とすることで赤(チャンネルR )を強調できます。
f:id:T_A_T:20190613222725j:plain

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

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

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

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