Home > 技術 > Retinexをpython+OpenCVでお手軽に味見する

Retinexをpython+OpenCVでお手軽に味見する

  • 2011-12-28 (水) 16:47
  • 技術

認識処理の前処理でSingle scale retinexをチョットかけてみたいなあというときにお手軽にPythonで実装してみようというお話です.
私が使っているのは Python2.7.1(Windows) + OpenCV2.3.1です.
OpenCV2.3系になってPythonでの使い勝手が更に向上したと感じています.
画像も行列もNumpyのarrayで統一されているので,あれもこれも,気持よく処理できます.
ますますCやC++を使うのが億劫になりそうです.
Retinexについては,ネット上に詳しい資料がたくさんあるので説明は省略させて頂きますが,恥ずかしながら私の書いたPythonスクリプトを参考用に載せておきます.
このスクリプトで処理した画像の例は次の通りです.

原画像

原画像


Retinex処理後

Retinex処理後


左側にいる歩行者がなんとなく確認しやすくなったかもしれません...
本物はGaussian使うべきなのでしょうが,認識の前処理ならBlurでも問題なかったりしますよね.
pythonスクリプトのコメントアウトを外せば確認できます.
スピード命のご時世ですので,処理内容はいつも手抜きと骨抜きの方向でございます.

#-------------------------------------------------------------------------------
# Name:        Retinex Test
# Author:      Tomoya Kamata (kamatomo@japan-iss.co.jp)
# Created:     26/12/2011
# Copyright:   (c) 2011 ISS Inc.
#-------------------------------------------------------------------------------
#!/usr/bin/env python

import cv2
import numpy as np
from math import *

def main():
    cv2.namedWindow('source')
    cv2.namedWindow('result')
    img = cv2.imread("source.jpg")
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

    g1 = (gray + 1.0) / 256.0
    g2 = (cv2.GaussianBlur(gray, (201, 201), 100) + 1.0) / 257.0
    #g2 = (cv2.blur(gray, (51, 51)) + 1.0) / 256.0  #こっちのほうが軽い
    g3 = cv2.log(g1 / g2) #Retinecs

    #正規化してみる
    g3_min, g3_max = g3.min(), g3.max()
    g4 =  ((g3 - g3_min) / (g3_max - g3_min)) * 255.0

    #uint8にキャスト
    result = np.zeros(g4.shape, dtype=np.uint8)
    result += g4

    #画像を保存するならコメントアウト
    #cv2.imwrite("gray.jpg", gray)
    #cv2.imwrite("retinex_out.jpg", result)

    cv2.imshow("source", gray)
    cv2.imshow("result", result)

    cv2.waitKey(-1)
    cv2.destroyAllWindows()

if __name__ == '__main__':
    main()

T.Kamata

Home > 技術 > Retinexをpython+OpenCVでお手軽に味見する

Search
Feeds
Meta

Return to page top