今回の内容

「2009-7-6:占有率10%ごとの二値画像を作成しよう」で作成した
二値画像のlacunarityを求めます。

新しくエディターを立ち上げてください。
名前は以下のようにします。
lacunairity07_06.rb

今立ち上げていただいたエディター(lacunairity07_06.rb)に
以下のように打ち込んでください。
打ち込みが終わったら「2009-7-6:占有率10%ごとの二値画像を作成しよう」
のときの作業ディレクトリーに保存してください。


(lacunairity07_06.rb)
###############################################################

pbm_file = "PBM/4_50.pbm"
############################################################
#任意のバイナリーファイルから任意のグライディングボックスサイズ(r)に対してのlacunariy値を求める
#r=2~255
class Lacunarity
  include Math
  #初期化
  def initialize (pbm_file)
    f = open(pbm_file)
    v = f.gets.chop.split                  #ヘッダーの読み込み
    @m = v[1].to_i;  @n = v[2].to_i
    @image = f.gets.chop.split
  end
############################################################
  #Gliding boxをスライドさせ,各Gliding box中の値の和を配列(array)に挿入
  def scan_box
    array = []                             #各Gliding box中の値の和を並べた配列
    (@n-@r+1).times do |j|                 #縦方向の繰り返し
      (@m-@r+1).times do |i|               #横方向の繰り返し
        k = i + j*@m                       #k:Gliding boxの左上隅の全体の通し番号における番号

        array << sum_in_box(k)             #各Gliding box中の値の和を配列(array)に挿入
      end
    end
    return array
  end
#############################################################
#任意のバイナリーファイルから任意のグライディングボックスサイズ(r)に対してのlacunariy値を求める
#Gliding box中の値の総和
#r:Gliding boxのサイズ
#Gliding boxの中の数字を一列の文字列(x)にする
#image:元画像データの名前
#m:元画像の横サイズ
#n:元画像の縦サイズ
#k:Gliding boxの左上隅の全体の通し番号における番号
#l:Gliding boxの最上段を0行目とカウントしたときのGliding boxの任意の行

  def sum_in_box(k)
    sum = 0                                         #文字列xの初期化
    @r.times do |l|
      @image[k+l*@m,@r].each{|x| sum += x.to_i}     #Gliding boxの一行ごとに切り出して加算
    end 
    return sum                                      #上で求めたgliding box内の和を返す
  end
#############################################################
  #配列arrayから平均値,分散,Lacunarityを計算
  def lacunarity(array)
    require 'mean_var'
    mean,var = mean_var(array)

  #p [mean,var]

    lac = var/mean**2 + 1
  end 
#############################################################
  #ある@rに対するlacunarityの計算
  def r2lac
         
    (2..50).each do |r|
      if r % 2 == 0                                 #rが偶数のときだけ計算する。%はあまりが0の意味
        @r = r
        #Gliding boxをスライドさせ,各Gliding box中の値の和を配列(array)に挿入
        array = scan_box
    
        #Lacunarityの計算
        lac = lacunarity(array)
        p [@r,lac,log(@r),log(lac)]
      end
    end  
  end
end      
############################################################### 
lac = Lacunarity.new(pbm_file) 
lac.r2lac
 ##################################################################

結果確認

今回は「2009-7-6:占有率10%ごとの二値画像を作成しよう」
で作成した二値画像のlacunairityの値を求めます。
特に今回は用いる画像はPBM/4_50.pbm(PBMディレクトリ内の4_50.pbm)です。
また、lacunarityはグライディングボックスサイズ(r)が2以上50以内の偶数に対して計算させます。

作業ディレクトリーでコマンドプロンプトを立ち上げてください。
立ち上げたコマンドぷとんぷとに以下のように打ち込みます。

ruby lacunairity07_06.rb   (エンターキー)

以下のような画面ができればOKです。



#ref error :ご指定のファイルが見つかりません。ファイル名を確認して、再度指定してください。 (Image2.jpg)

値の意味
左の列から順に
グライディングボックスのサイズ(r)
サイズrのときのLacunarity
グライディングボックスのサイズの自然対数ln(r)
サイズrのときのLacunarityの自然対数

このとき現れている数字をファイルに書き出します。
コマンドプロンプトに新しく以下のコマンドを実行します。
書き出すファイルはlog_r_lacとします。

ruby lacunarity07_06.rb > log_r_lac.txt (エンター)

作業ディレクトリにできたlog_r_lacをエディタで見てください。
見ていただくと、[… , … , …]といっぱい数字が書いてあると思います。
この[や,や]をすべてスペースで置き換えてください。
次に右の2行だけをのこしてすべて消してください。
以上の作業が終わったら保存をしてください。

このときのln(r)とln(lacunarity)との関係をグラフで見て見ましょう。
新しくwgnuplotを立ち上げてください。

立ち上げたら作業領域まで移動してください。
移動方法はコマンドプロンプトとほぼ同じです。

作業領域まで移動したら以下のように打ち込んでください

plot 'log_r_lac.txt' w l

すると以下のようなグラフが出てくると思います。

#ref error :ご指定のファイルが見つかりません。ファイル名を確認して、再度指定してください。 (Image3.jpg)


これは横軸がグライディングボックスのサイズrの自然対数値、
縦軸はそのときのlacunarityの自然対数値を示しています。

今回は以上です。
お疲れ様でした。

タグ:

+ タグ編集
  • タグ:
最終更新:2009年11月09日 13:52