- 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スクリプトを参考用に載せておきます.
このスクリプトで処理した画像の例は次の通りです.
左側にいる歩行者がなんとなく確認しやすくなったかもしれません...
本物は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
- Newer: 画像から対象を検出して数える検討
- Older: Cat Face Transform (CFT)