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
技術的な覚書きへ戻る
2860
Keyword(s):
References:[技術的な覚書き] [左手法のアルゴリズム]