【Google Colab】OpenCVで画像のガンマ補正


はじめに

画像処理では、必ずしもキレイな画像を用意できるとは限りません。
暗いものや、逆に明るすぎる画像が含まれていることがあります。
画像の明るさを調節する方法に、ガンマ補正というものがあります。

今回は、Pythonを使ってOpenCVによる画像のガンマ補正を行います。

ガンマ補正とは

ガンマ補正(あるいはガンマ変換)とは、簡単にいうと画像の明るさを調整する方法です。

画像には、一般に暗い部分と明るい部分が含まれています。
そういった場合に、画像全体に対して同じ割合で明るさを調整するのではなく、それぞれの画素値に応じて明るさを調整する方法がガンマ補正の特徴です。
ガンマ補正の式は以下です。

y = 255\times\Bigl(\frac{x}{255}\Bigr)^{1/\gamma}

xはインプットの画素値、yはアウトプットの画素値です。
$\gamma$(ガンマ)の値によって出力が変わるので、ガンマ補正と呼ばれています。
$\gamma$が1より大きいと明るく、1より小さいと暗くなります。

ガンマ補正のグラフは以下のようになります。

準備

環境はGoogle Colaboratoryを使用します。
Pythonのバージョンは以下です。

import platform
print("python " + platform.python_version())
# python 3.6.9

画像を表示してみよう

では、早速コードを書いていきましょう。

まずは、OpenCVをインポートします。

import cv2

さらに、Colaboratoryで画像を表示するため、以下もインポートします。

from google.colab.patches import cv2_imshow

サンプルの画像も用意しておきましょう。
今回は、Pixabayのフリー画像を使用します。

それでは、用意したサンプル画像を表示してみましょう。

img = cv2.imread(path) # pathは画像を置いている場所を指定
cv2_imshow(img)

それでは、ガンマ補正を用いて画像を明るくしてみましょう。
あらかじめ、ガンマ補正する関数をつくっておきます。

import numpy as np

def create_gamma_img(gamma, img):
  gamma_cvt = np.zeros((256,1), dtype=np.uint8)
  for i in range(256):
    gamma_cvt[i][0] = 255*(float(i)/255)**(1.0/gamma)
  return cv2.LUT(img, gamma_cvt)

ガンマ補正の画像を元画像と並べて表示してみます。

img_gamma = create_gamma_img(2, img)
imgs = cv2.hconcat([img, img_gamma])
cv2_imshow(imgs)

$\gamma$を1より大きくすると明るくなります。
上記では2としてみました。

それでは、$\gamma$の値を色々と変えてガンマ補正した画像を表示してみましょう。

img1 = create_gamma_img(0.33, img)
img2 = create_gamma_img(0.5, img)
img3 = create_gamma_img(0.66, img)
img4 = create_gamma_img(1.5, img)
img5 = create_gamma_img(2, img)
img6 = create_gamma_img(3, img)
imgs_1 = cv2.hconcat([img1, img2, img3])
imgs_2 = cv2.hconcat([img4, img5, img6])
imgs = cv2.vconcat([imgs_1, imgs_2])
cv2_imshow(imgs)

左上から順に、$\gamma$の値を大きくしていきました。
上段は元画像より暗く、下段は元画像より明るくなっています。

まとめ

今回は、Pythonを使ってOpenCVにより画像のガンマ補正(ガンマ変換)を行いました。

画像の明るさを調節する必要が出てきたら、ガンマ補正を試してみて下さい。

ガンマ補正(ガンマ変換)に関するさらに詳しい内容は、以下が参考になります。