さっき撮った写真なんだけど、全体的に暗い気がする…。
OpenCVで明るさ調整をする方法はないの?
ありますよ!
では今回は、「OpenCVで画像の明るさ調整をする方法」を
できるだけわかりやすく解説いたします。
また、「部分的に明るさ調整をする方法」や
「複数の画像を一括処理する方法」も紹介しておりますので、
ぜひ最後まで読んでいってください。
OpenCVで画像の明るさ調整をする方法
「convertScaleAbs」を使います。
まずは画像全体の明るさ調整をしてみましょう。
ひとまず全コードと実行結果をお見せします。
解説は後ほど行います。
全コード
import cv2
input_img = cv2.imread('C:/Utatane/input_img.jpg')
output_img = cv2.convertScaleAbs(input_img, alpha=1.5, beta=0)
cv2.imwrite('C:/Utatane/output_img.jpg', output_img)
output_img = cv2.convertScaleAbs(input_img, alpha=1.5, beta=0)
実行結果
事前準備
- OpenCVのインストール
画像を加工したり編集したりするには「OpenCV」のインストールが必要です。
OpenCVを初めて使用する場合は、下記コードを入力・実行して、インストールしてください。
pip install opencv-python
※OpenCVを使用したことがある場合は、このインストール作業は不要です。
解説
※わかりやすさを重視しております。厳密には解釈が異なる場合がありますことをご了承ください。
インポートや画像の読み込み・保存方法の解説は、下記記事をご参考ください。
画像の明るさ調整
output_img = cv2.convertScaleAbs(input_img, alpha=1.5, beta=0)
上記一文にて、画像の明るさ調整を行うことができます。
まず新しい変数を書いたら、「=(イコール)」を書きます。
変数名の付け方には注意すべき点があります。下記記事をご参考ください。
イコールの後ろに「cv2.convertScaleAbs()」を書きます。
()内の引数には「読み込んだ画像が入った変数」「alpha」「beta」を指定します。
【alpha】
明るさの増減を数値で指定します。
・1:基準値(元の明るさのまま)
・1を超える値:数値が大きくなるにつれて明るくなる(2なら明るさが2倍)
・0を超え、1未満:数値が小さくなるにつれて暗くなる(0.5なら明るさが半分)
alphaで明るさ調整をした場合、明るいところはさらに明るく、暗いところは暗いままなのが特徴です。
【beta】
「alpha」は明るさを倍増させるに対し、「beta」は定数の明るさを追加します。
betaで明るさ調整をした場合、明るいところも暗いところも全体的に明るくすることができます。
部分的に明るさ調整をする方法
画像の一部分だけ明るさ調整をすることもできます。
コードとざっくりとした処理は以下の通りです。
import cv2
input_img = cv2.imread('C:/Utatane/input_img.jpg')
output_img = input_img.copy()
x1, y1 = 150, 200
x2, y2 = 300, 450
x1_y2 = input_img[y1:y2, x1:x2]
adjusted_roi = cv2.convertScaleAbs(x1_y2, alpha=2, beta=0)
output_img[y1:y2, x1:x2] = adjusted_roi
cv2.imwrite('C:/Utatane/output_img.jpg', output_img)
<コードの5行目~13行目>
5行目:元データをコピー(バックアップをとる)
7・8行目:明るさ調整する部分を指定
9行目:明るさ調整をしたい部分を切り抜く
11行目:切り抜いた部分のみの明るさを調整
13行目:明るくなった部分を元画像の元の位置に重ねる
切り抜きに関する詳細は下記記事をご参考ください。
では、実行結果を見てみましょう。
明るくした部分の境界線が気になるかもしれませんが、
座標をズラして少しずつ明るさを変えていくことで、境界線をぼやかすこともできます。
複数の画像ファイルの明るさ調整をする方法(一括処理)
フォルダにある全ての画像の明るさ調整をすることも可能です。
下記コードはfor文を使ってフォルダ内にある全ての画像の明るさを調整した例です。
import cv2
import os
os.makedirs('C:/Utatane/output', exist_ok=True)
for filename in os.listdir('C:/Utatane'):
if filename.endswith('.jpg') :
input_img = cv2.imread(os.path.join('C:/Utatane', filename))
output_img = cv2.convertScaleAbs(input_img, alpha=1.5, beta=0)
cv2.imwrite(os.path.join('C:/Utatane/output', filename), output_img)
こちらもざっくりと解説いたします。
<コード4行目>
出力するフォルダを作成
<コード6行目~最後>【for文でファイルが無くなるまでループ】
6行目:取り込みフォルダ内のファイルを取り込み
7行目:拡張子が「jpg」なら以下の操作を行う
8行目:取り込みフォルダのパスとファイル名を連結(フルパスに)して取り込み
9行目:画像の明るさを調整
10行目:出力フォルダパスとファイル名を連結(フルパスに)して出力
これでフォルダ内の画像すべての明るさを調整することができます。
うまく動作しない場合の対処法
画像の読み込みができない
画像ファイルが存在しない場合や、ファイルが破損している場合などは画像の読み込みができません。
画像を読み込み・保存する方法の記事を参考に、再度確認してください。
画像が保存されない
存在しないフォルダを指定した場合、画像は保存されません。
画像を読み込み・保存する方法の記事を参考に、再度確認してください。
エラーが出る
No module named ‘cv2’
これは、OpenCVがインストールできていない場合に出るエラーです。
事前準備の項を参考に、OpenCVのインストールを完了させてください。
OpenCV(4.10.0) ~ img.empty() ~
画像の読み込みが正常に行えていない可能性があります。
画像を読み込み・保存する方法の記事を参考に、画像のパスや形式を確認してください。
○○ is not defined
今まで出てきていない変数などを処理しようとした時に出るエラーです。
変数名などが間違っていないかチェックしましょう。
詳しい解説は、下記記事をご参考ください。
その他のエラー
その他のエラーが出た場合は、エラー文をコピーしてNETで検索してみましょう。
最後に
OpenCVで画像の明るさ調整をする方法を解説いたしました。
当ブログでは、Pythonに関する情報を配信しております。
この記事がわかりやすいと感じた方は、他の記事も読んでいってください。
挫折せずにPythonを独学で学習する方法は特におすすめです。
最後までお読みいただき、ありがとうございました。がんばってください!