風景写真をクッキリさせる(空を青く、緑を鮮やかに)
風景写真より鮮やかに変換します。草むらと空を写した写真で草むらの緑をより鮮やかに、空の青さをより強く変換します。
関連記事
環境
準備
変換する画像をjupyter notebookファイル(***.ipynb)と同じディレクトリにファイル名'image.jpg'で保存しました。
コード
画像の空のある部分の輝度を確認すると、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'が保存されます。
草むらの強調に用いた補正カーブ(gamma=2)は以下の通りです。横軸が元の値、縦軸が変換後の値です。G値が小さいほど強調される(輝度の増加割合が大きい)変換となります。
一方、空のG値、R値の補正に用いたカーブ(gamma=0.5)は以下の通りです。元の値が大きいほど輝度の低下割合が大きい変換になります。
以下のサイトを参考にさせていただきました
Python 版 OpenCV 入門 >> (画像補正) 編
Optie研 >> Python3 & OpenCV で画像処理を学ぶ[3] 〜 トーンカーブ と LUT を理解する実装実験
【OpenCV】ルックアップテーブルを用いた階調変換【Python】