Pythonでいろいろやってみる

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

風景写真をクッキリさせる(空を青く、緑を鮮やかに)

風景写真より鮮やかに変換します。草むらと空を写した写真で草むらの緑をより鮮やかに、空の青さをより強く変換します。

関連記事

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

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

変換する画像をjupyter notebookファイル(***.ipynb)と同じディレクトリにファイル名'image.jpg'で保存しました。 f:id:T_A_T:20200411165604j:plain

コード

画像の空のある部分の輝度を確認すると、B(青)G(緑)R(赤) = 254, 212, 137 となっておりB値はほぼ最大値(255)となっていることが分かります。
一方、草むらある部分の輝度を確認すると、B(青)G(緑)R(赤) = 40, 92, 55 でした。
なのでB値が200より大きい画素を空として、その画素のG、Rを下げ相対的にBを大きくし青味を強調します。変換式としてガンマ補正(gamma=0.5)を用います。
B値が200以下の画素を草むらとし、その画素のG値を大きくします。変換式としてガンマ補正(gamma=2)を用います。

import cv2
import numpy as np
import math

gamma_blue = 0.5
gamma_green = 2

img = cv2.imread('image.jpg')  # 画像の読み出し
y = img.shape[0]
x = img.shape[1]
for i in range(y):
    for j in range(x):
        if img[i, j][0] > 200:  # B値が200より大きい場合に 
            img[i, j][1] = int((img[i, j][1]/255)**(1.0/gamma_blue)*255)  # G値を低減
            img[i, j][2] = int((img[i, j][2]/255)**(1.0/gamma_blue)*255)  # R値を低減
        else:    # B値が200以下の場合に 
            img[i, j][1] = int((img[i, j][1]/255)**(1.0/gamma_green)*255)  # G値を強調
cv2.imwrite('image_conv.jpg',img)  # 画像を保存
実行結果

空の青さが強調され、緑がより鮮やかになった画像'image_conv.jpg'が保存されます。 f:id:T_A_T:20200411165703j:plain
草むらの強調に用いた補正カーブ(gamma=2)は以下の通りです。横軸が元の値、縦軸が変換後の値です。G値が小さいほど強調される(輝度の増加割合が大きい)変換となります。
f:id:T_A_T:20200411170617p:plain
一方、空のG値、R値の補正に用いたカーブ(gamma=0.5)は以下の通りです。元の値が大きいほど輝度の低下割合が大きい変換になります。
f:id:T_A_T:20200411170629p:plain

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

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

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

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