OTO-Ohshima Tamashima Observatory-  Index  Search  Changes  Login

Rubyによる星像範囲の探査

大きくデフォーカスして写した画像からオートマチックに複数の星像を検出し、それぞれの重心を求めるためには、まず1つの星像がどこまで広がっているかという範囲を知る必要がある。

 星像の範囲を知るには、星像内部の点(例えば最輝値ピクセル)から出発し、閾値を超える値を持ったピクセルの連続した範囲の壁に沿って調べてゆく方法が考えられる。壁に沿って例えば右回りにたどろうとすると、解法としては迷路探索の左手法が考えられる。ここでは外積を使った左手法のアルゴリズムを適用し、再帰を使った連続領域範囲(ある閾値を超えた領域)の探査アルゴリズムをRubyで実装してみた。

leftHand.gif

以下のアルゴリズムはうまくいっているようです。

  def left_hand_search(x,y,dxp,dyp) #再帰を使った連続領域範囲の探査 
# 引数:現在のx,y座標、dxp:直前のx増分、dyp:直前のy増分
# 事前に定義が必要なインスタンス変数
#  @im[]  披検査画像(Narray)
#  @thres 閾値
    pixel_value=@im[x,y]
#    print "("+x.to_s+","+y.to_s+")",  pixel_value
    if pixel_value>= @thres then
      if @miny>y then @miny=y end  #星像範囲設定
      if @maxx<x then @maxx=x end
      if @maxy<y then @maxy=y end
      if @minx>x then @minx=x end
      unless (@lx==x and @ly==y) then
        l_value=@im[x+dyp,y-dxp]
        fw_value=@im[x+dxp,y+dyp]
        r_value=@im[x-dyp,y+dxp]
        case 
        when l_value >= @thres
#p          'toL'
          left_hand_search(x+dyp,y-dxp,dyp,-dxp)
        when fw_value >= @thres 
#p          'fwd'
          left_hand_search(x+dxp,y+dyp,dxp,dyp)
        when r_value >= @thres
#p          'toR' 
          left_hand_search(x-dyp,y+dxp,-dyp,dxp)
        else
#p          'back'
          left_hand_search(x-dxp,y-dyp,-dxp,-dyp)
        end
      end
     else
#p      'less than threshold'
       @lx=@lx-dxp
       @ly=@ly-dyp
       left_hand_search(x-dxp,y-dyp,-dxp,-dyp)
    end
  end

技術的な覚書きへ戻る

OTO-Ohshima Tamashima Observatory-トップへ戻る

745
Last modified:2009/06/13 20:06:36
Keyword(s):
References:[左手法のアルゴリズム] [技術的な覚書き]