Home

アイエスエス株式会社 "Innovative System Solutions"

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

認識処理の前処理で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

Cat Face Transform (CFT)

画像データを圧縮したり特徴量を計算したり…等といった方法について調べていると「直交基底関数群を用いて云々~」という話を見かけることがあるのですが,数式アレルギーな私にとって,そういった直交関数群とやらの数式は大抵,一見した瞬間に逃げ出したくなるような様相を呈しており…

…というわけで,心理的な障害を乗り越えるために,複雑な数式のかわりに,猫の顔画像を用いて画像からの特徴ベクトル(?)抽出→特徴ベクトルから画像復元...みたいなのをやってみました.にゃーん.

用いた猫画像群については,最初の3つはうちの猫,残り30はネット上から拾ってきた画像なのですが,グラムシュミットの直交化のせいで,最後の方は猫画像なのかどうかわからなくなってしまっています.
せっかくの猫画像がノイズ画像みたくなってしまうのでは何のための猫だったのか.心情的に好ましくなく,改善が望まれます.
もっと大量の猫画像群(一般的なPCのHDDには猫画像の100や200は保存されている)から,元から互いに内積が0に近い猫画像セットを選抜して使うとかすれば有る程度改善できるかもしれません.
(あるいは他の直交化の方法を探すとか…?)

by nakiusagi3

Home

Search
Feeds
Authorized
奨学金支援制度
Meta

Return to page top