今回の内容
「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