OTO - Ohshima Tamashima Observatory- - search_erea Diff
- Added parts are displayed like this.
- Deleted parts are displayed
like this.
大きくデフォーカスして写した画像からオートマチックに複数の星像を検出し、それぞれの重心を求めるためには、まず1つの星像がどこまで広がっているかという範囲を知る必要がある。
星像の範囲を知るには、星像内部の点(例えば最輝値ピクセル)から出発し、閾値を超える値を持ったピクセルの連続した範囲の壁に沿って調べてゆく方法が考えられる。壁に沿って例えば右回りにたどろうとすると、解法としては迷路探索の左手法が考えられる。ここでは外積を使った[[左手法のアルゴリズム]]を適用し、再帰を使った連続領域範囲(ある閾値を超えた領域)の探査アルゴリズムをRubyで実装してみた。
[[http://otobs.org/tech/leftHand.gif]]
以下のアルゴリズムは未完成ですアルゴリズムはうまくいっているようです。
<<<
require 'narray'
def leftHandSearch(x,y,dxp,dyp) left_hand_search(x,y,dxp,dyp) #再帰を使った連続領域範囲の探査
puts "("+x.to_s+","+y.to_s+")"
@ary[[x,y]]=-1
# 引数:現在のx,y座標、dxp:直前のx増分、dyp:直前のy増分
# 事前に定義が必要なインスタンス変数
#探査済み領域はー1とする
if@miny>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
if @maxx<x then @maxx=x end
if@maxy<y
if @maxy<y then @maxy=y end
if@minx>x
if @minx>x then @minx=x end
if ((@im[x+dxp,y+dyp]>@thres)&&(@ary[[x+dxp,y+dyp]]!=-1))
leftHandSearch(x+dxp,y+dyp, dxp, dyp) #直進してよい場合
else #右へ回れ(実際の画像の座標系では、左回りになる)
dxf=dyp
dyf=(-1)*dxp
if ((@im[x+dxf,y+dyf]>@thres)&&(@ary[[x+dxf,y+dyf]]!=-1))
leftHandSearch(x+dxf,y+dyf, dxf, dyf)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
end
# make a test image
@im=NArray.int(10,10).fill!(0)
(3..7).each do |x|
(2..6).each do |y|
@im[x,y]=2
end
end
@ary=Hash.new #探査済み領域チェック用
@maxx=@maxy=0
@minx=@miny=10000
@thres=1 #星像検出の閾値
leftHandSearch(5,5,1,0)
puts @minx,@maxx,@miny,@maxy #連続領域範囲
>>>
<<<
その出力
o2@am2:~/ruby/fits$ ruby testLeftHandSearch.rb
(5,5)
(6,5)
(7,5)
(7,4)
(7,3)
(7,2)
(6,2)
(5,2)
(4,2)
(3,2)
(3,3)
(3,4)
(3,5)
(3,6)
(4,6)
(5,6)
(6,6)
(7,6)
3
7
2
6
>>>
----
[[技術的な覚書き]]へ戻る
[[OTO-Ohshima Tamashima Observatory-]]トップへ戻る
{{counter}}
星像の範囲を知るには、星像内部の点(例えば最輝値ピクセル)から出発し、閾値を超える値を持ったピクセルの連続した範囲の壁に沿って調べてゆく方法が考えられる。壁に沿って例えば右回りにたどろうとすると、解法としては迷路探索の左手法が考えられる。ここでは外積を使った[[左手法のアルゴリズム]]を適用し、再帰を使った連続領域範囲(ある閾値を超えた領域)の探査アルゴリズムをRubyで実装してみた。
[[http://otobs.org/tech/leftHand.gif]]
以下の
<<<
puts "("+x.to_s+","+y.to_s+")"
@ary[[x,y]]=-1
# 引数:現在のx,y座標、dxp:直前のx増分、dyp:直前のy増分
# 事前に定義が必要なインスタンス変数
#
if@miny>y
# @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
if @maxx<x then @maxx=x end
if@maxy<y
if @maxy<y then @maxy=y end
if@minx>x
if @minx>x then @minx=x end
if ((@im[x+dxp,y+dyp]>@thres)&&(@ary[[x+dxp,y+dyp]]!=-1))
leftHandSearch(x+dxp,y+dyp, dxp, dyp) #直進してよい場合
else #右へ回れ(実際の画像の座標系では、左回りになる)
dxf=dyp
dyf=(-1)*dxp
if ((@im[x+dxf,y+dyf]>@thres)&&(@ary[[x+dxf,y+dyf]]!=-1))
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
# make a test image
@im=NArray.int(10,10).fill!(0)
(3..7).each do |x|
(2..6).each do |y|
@im[x,y]=2
end
end
@ary=Hash.new #探査済み領域チェック用
@maxx=@maxy=0
@minx=@miny=10000
@thres=1 #星像検出の閾値
leftHandSearch(5,5,1,0)
puts @minx,@maxx,@miny,@maxy #連続領域範囲
その出力
o2@am2:~/ruby/fits$ ruby testLeftHandSearch.rb
(5,5)
(6,5)
(7,5)
(7,4)
(7,3)
(7,2)
(6,2)
(5,2)
(4,2)
(3,2)
(3,3)
(3,4)
(3,5)
(3,6)
(4,6)
(5,6)
(6,6)
(7,6)
3
7
2
6
[[技術的な覚書き]]へ戻る
[[OTO-Ohshima Tamashima Observatory-]]トップへ戻る
{{counter}}