2012年1月3日火曜日

勾配方向画像のHSV表示

HOG特徴とかEOH特徴を使ったスライド資料を作る時など,エッジの勾配方向をかっこ良く色分けした画像を載せると見栄えが良くなりわかりやすい.
その画像だけを作る労力もバカにならないと思うのです.例えばこんな画像のこと

左側は原画で,右側はソベルフィルター処理後に勾配の方向を求め角度によって色分け表示してます.HOGの著者Dalalさんたちの論文に掲載されている画像をイメージして作りました
盛岡の月が丘のあたりで研究用に撮影した画像のなのだけれどストックを手に散歩したおじさんが写っていた.乾いた路面の上なのだがきっとストックがあると足への負担が軽減されるのだろうか

こういう画像のような色分けをするときHSV色空間を使うのだけど使うたびに計算式を調べたりしている.ちゃんと自分のライブラリとして管理するべきなんだけど毎日使うわけじゃないのでつくったコードの存在自体を忘れる始末.毎回ググってる状態なのでいっその事ウェブに掲載してしまえば未来の自分が再利用する確率が高いのかも知れない

という訳でRGBからHSVに変換するコードを載せちゃいます.
プレゼン資料を作るための画像処理は,私の場合はPythonでお手軽にすませるこが多いです.
def hsv2rgb(h, s, v):
    h = float(h)
    s = float(s)
    v = float(v)
    h60 = h / 60.0
    h60f = math.floor(h60)
    hi = int(h60f) % 6
    f = h60 - h60f
    p = v * (1 - s)
    q = v * (1 - f * s)
    t = v * (1 - (1 - f) * s)
    r, g, b = 0, 0, 0
    if hi == 0: r, g, b = v, t, p
    elif hi == 1: r, g, b = q, v, p
    elif hi == 2: r, g, b = p, v, t
    elif hi == 3: r, g, b = p, q, v
    elif hi == 4: r, g, b = t, p, v
    elif hi == 5: r, g, b = v, p, q
    r, g, b = int(r * 255), int(g * 255), int(b * 255)
    return (b, g, r)#cv2.cv.CV_RGB(r, g, b)
よくブログなどに備忘録として掲載しますなどと書いてあることがあって正直なところ意味不明だと思ってたんだけどやっとその思考が理解できたようなつもりになったのでした

追記)
入力画像のエッジ勾配方向をHSV表示するスクリプトを公開しておきました.こちらです