Rubyによる星像範囲の探査
大きくデフォーカスして写した画像からオートマチックに複数の星像を検出し、それぞれの重心を求めるためには、まず1つの星像がどこまで広がっているかという範囲を知る必要がある。
星像の範囲を知るには、星像内部の点(例えば最輝値ピクセル)から出発し、閾値を超える値を持ったピクセルの連続した範囲の壁に沿って調べてゆく方法が考えられる。壁に沿って例えば右回りにたどろうとすると、解法としては迷路探索の左手法が考えられる。ここでは外積を使った左手法のアルゴリズムを適用し、再帰を使った連続領域範囲(ある閾値を超えた領域)の探査アルゴリズムをRubyで実装してみた。
以下のアルゴリズムはうまくいっているようです。
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
技術的な覚書きへ戻る
2636
Keyword(s):
References:[左手法のアルゴリズム] [技術的な覚書き]