ブログ名

AIで室内の人間をカウントする研究記録④

概要

前回の続きです。
今回は入力画像に対する前処理を行ってみたいと思います。

前処理とは

画像処理を行う際にその画像に対してあらかじめ何らかの処理を施すこと前処理といいます。 例えば、画像ノイズ除去や、色調補正、閾値処理など様々なものがあります。
今回はPythonの画像処理ライブラリであるPillowを用いた回転、色調補正による前処理を紹介します。

回転

画像の向きが横を向いていたりなど、傾いた画像では物体検出を行っても本来の精度が出づらいです。

なので、画像の傾きを回転処理によって正します。 画像の回転はPillowライブラリを用いると簡単に行うことが出来ます。

from PIL import Image

image = Image.open("image_path")
image = image.rotate(270) #270度反時計回りに回転

元画像 f:id:shizuuuka0202:20191220223501j:plain 処理後 f:id:shizuuuka0202:20191220223537j:plain

  • 原理
    画像の回転後のピクセルの座標を計算してそこに新たにプロットすることで回転できます。
    座標を計算する上で、原点は画像の中心にしたいため、初めに各座標から幅w/2と高さh/2を引きます。回転後、再び幅w/2と高さh/2を足すことで座標原点を元に戻します。

    f:id:shizuuuka0202:20191220224644p:plain

色調補正

様々な色調補正を用いて精度検証を行ってみた結果、効果の得られた処理を紹介します。

各処理での補正値(補正の強さを決める値)は色々いじりながら結果を見つつ最もよさそうなものを選ぶのが良いです。画像によって補正値は変わってきますので、特に明るさに関する処理は適宜最適なものを探してみてください。
以下に記載している補正値は参考程度にどうぞ。

明度

画像が全体的に暗い場合に有効です。

from PIL import ImageEnhance

con = ImageEnhance.Brightness(image)
image = con.enhance(2.0)

元画像 f:id:shizuuuka0202:20191220225008j:plain 処理後 f:id:shizuuuka0202:20191220225123j:plain

  • 原理
    明度補正は各画素ごとの輝度値を入力した補正値の定数倍します。
    補正値が0の場合、画像は真っ暗になります。

ガンマ補正

明度と同様、画像が全体的に暗い場合に有効です。
ガンマ補正とは簡単に説明すると、明るさの偏りを直す処理です。
明るさ補正用の関数のため、自然な感じのまま明るさを変更することが出来ます。
明度補正のような、白っぽくなったり黒っぽくなったりしてしまう問題がありません。

def gamma_table(gamma_r, gamma_g, gamma_b, gain_r=1.0, gain_g=1.0, gain_b=1.0):
    r_tbl = [min(255, int((x / 255.) ** (1. / gamma_r) * gain_r * 255.)) for x in range(256)]
    g_tbl = [min(255, int((x / 255.) ** (1. / gamma_g) * gain_g * 255.)) for x in range(256)]
    b_tbl = [min(255, int((x / 255.) ** (1. / gamma_b) * gain_b * 255.)) for x in range(256)]
    return r_tbl + g_tbl + b_tbl

image = image.point(gamma_table(1.5, 1.5, 1.5))

元画像 f:id:shizuuuka0202:20191220225225j:plain 処理後 f:id:shizuuuka0202:20191220225305j:plain * 原理
具体的には、以下の数式を用いて各画素ごとの輝度値を指数関数で変換します。
γ =1のときf(x) = x をとります。
γ > 1のとき画像は明るくなります。
γ < 1のとき画像は暗くなります。
f:id:shizuuuka0202:20191220230600p:plain

コントラスト

画像においてコントラスト処理を行うと、明暗の対比の強さを調整することが出来ます。

from PIL import ImageEnhance

con = ImageEnhance.Contrast(image)
image = con.enhance(1.5)

元画像 f:id:shizuuuka0202:20191220225607j:plain 処理後 f:id:shizuuuka0202:20191220225635j:plain * 原理
ピクセルはRGB成分を0~255の範囲で値を持ち、各RGB成分はf(x) = xのような傾き1の直線を描画します。
ここで直線の傾きを急にしてあげればコントラストは上がります。 変数cをとることで一定以下(以上)の値を切り捨て、切り捨てられた範囲を再び0~255に落とし込むことで傾き(コントラスト)を変えることが出来ます。

f:id:shizuuuka0202:20191220225848p:plain

シャープネス

シャープネス補正は物体の輪郭の鮮明度を調整することが出来ます。

from PIL import ImageEnhance

con = ImageEnhance.Sharpness(image)
image = con.enhance(2.0)

元画像 f:id:shizuuuka0202:20191220230004j:plain 処理後 f:id:shizuuuka0202:20191220230052j:plain * 原理
ある画素に注目して、その画素の周囲8マスを含めた9マスに対して以下に示すような係数を乗算します。 f:id:shizuuuka0202:20191220230228p:plain   得られた値をすべて加算し、最後に2で割った値を、新たな注目画素の画素値とするフィルタ処理を行うことにより、画像をシャープ化することができます。

次回

今回の研究記録とは少し離れますが、手こずっていたawsでの環境構築が最近出来たので、その方法等を一度ご紹介したいと思います。

参考

gamma conversion(glayscale
色の変化とコントラスト
sharpen image (glayscale)


次の記事へ

前の記事へ 目次へ戻る