jupyter notebookのUIで画像の色味をインタラクティブに調整する
ipywidgetsはjupyter notebookにUIを設置できるモジュールです。様々なガジェットを配置しそれらの入力に応じてコードの実行結果を変えることができます。
画像処理を行う際には、処理後の画像を見ながらパラメーターを調整したい場面が多く、ipywidgetsで入力値を調整しながら結果を見られると便利です。アジサイの写真のb,g,r各チャンネルのガンマ補正のγ値をスライダーにより変えてインタラクティブに色味を補正します。
Pystyle >> OpenCV – 画像の明るさ、コントラストの変更、ガンマ補正
のコードを改変して使わせていただきました。
関連記事
ルックアップテーブルによる画像コントラストの補正
ルックアップテーブルで画像の彩度、明度を調整する(画像を明るく鮮やかにする)
アジサイの写真を明るく鮮やかにする
環境
準備
画像ファイルはフリー写真素材ぱくたそからダウンロードさせていただき、jupyter notebookファイル(***.ipynb)と同じディレクトリにファイル名'ajisai.jpg'で保存しました。
コード
3つのスライダー用意して、それぞれの値をb(青)、g(緑)、r(赤)各チャンネルに対するγ補正のγ値に用います。
import cv2 import numpy as np from IPython.display import Image, display from ipywidgets import widgets def process(img, b, g, r): look_up_table = np.zeros((256, 1), dtype=np.uint8) for i in range(256): look_up_table[i][0] = (i/255)**(1.0/b)*255 dst[:, :, 0] = cv2.LUT(img[:, :, 0], look_up_table) for i in range(256): look_up_table[i][0] = (i/255)**(1.0/g)*255 dst[:, :, 1] = cv2.LUT(img[:, :, 1], look_up_table) for i in range(256): look_up_table[i][0] = (i/255)**(1.0/r)*255 dst[:, :, 2] = cv2.LUT(img[:, :, 2], look_up_table) encoded = cv2.imencode('.png', dst)[1] display(Image(encoded, width=400)) param_widgets = {} # パラメータ'b'を設定するスライダー param_widgets['b'] = widgets.FloatSlider( min=0.1, max=3.01, step=0.1, value=1.0, description='b: ') # パラメータ'g'を設定するスライダー param_widgets['g'] = widgets.FloatSlider( min=0.1, max=3.01, step=0.1, value=1.0, description='g: ') # パラメータ'r'を設定するスライダー param_widgets['r'] = widgets.FloatSlider( min=0.1, max=3.01, step=0.1, value=1.0, description='r: ') for x in param_widgets.values(): x.layout.width = '400px' # 画像を読み込む。 img = cv2.imread('ajisai.jpg') dst = cv2.imread('ajisai.jpg') # ウィジェットを表示する。 widgets.interactive(process, img=widgets.fixed(img), **param_widgets)
実行結果
元画像のまま(γ値 b:1, g:1, r:1)
スライダーを動かしb(青)を2.5と強調します。r(赤)は0.5として弱めます(γ値 b:2.5, g:1, r:0.5)
緑を強調します(γ値 b:1.1, g:2.6, r:0.9)
以下のサイトを参考にさせていただきました
Pystyle >> OpenCV – 画像の明るさ、コントラストの変更、ガンマ補正