OTO-Ohshima Tamashima Observatory-  Index  Search  Changes  Login

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増分
# 事前に定義が必要なインスタンス変数
#  @im[]  披検査画像(Narray)
#  @thres 閾値
    pixel_value=@im[x,y]
#
   #探査済み領域はー1とする

  if@miny>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}}