Pythonでいろいろやってみる

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

jupyter notebookのUIで画像の色味をインタラクティブに調整する

 ipywidgetsはjupyter notebookにUIを設置できるモジュールです。様々なガジェットを配置しそれらの入力に応じてコードの実行結果を変えることができます。
 画像処理を行う際には、処理後の画像を見ながらパラメーターを調整したい場面が多く、ipywidgetsで入力値を調整しながら結果を見られると便利です。アジサイの写真のb,g,r各チャンネルのガンマ補正のγ値をスライダーにより変えてインタラクティブに色味を補正します。

Pystyle >> OpenCV – 画像の明るさ、コントラストの変更、ガンマ補正
のコードを改変して使わせていただきました。

関連記事

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

環境
  • windows10 home
  • jupyter notebook 6.3.0
  • Python 3.8.8
  • OpenCV 4.0.1
  • ipywidgets 7.6.3
準備

画像ファイルはフリー写真素材ぱくたそからダウンロードさせていただき、jupyter notebookファイル(***.ipynb)と同じディレクトリにファイル名'ajisai.jpg'で保存しました。
f:id:T_A_T:20210822212230j:plain

コード

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)
f:id:T_A_T:20210907202502p:plain

スライダーを動かしb(青)を2.5と強調します。r(赤)は0.5として弱めます(γ値 b:2.5, g:1, r:0.5)
f:id:T_A_T:20210907202523p:plain

緑を強調します(γ値 b:1.1, g:2.6, r:0.9)
f:id:T_A_T:20210907202545p:plain

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

Pystyle >> OpenCV – 画像の明るさ、コントラストの変更、ガンマ補正

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

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