Lacunarityを実際に求めてみよう
今回はエディターとrubyを用いて実際にLacunarityを求めてみましょう.
本来なら実際の画像データを二値化することから始まりますが,それは今回は考えず,
今日は模擬的なバイナリーデータを作成し,そのLacuanrityを求めます.
二値化の作業については"2009-3-26:衛星画像を二値化してみよう"を参照ください.
それでは,エディターを作成したいと思います.
バイナリーデータの作成
エディターを立ち上げてください.
ファイル名は lacunarity01.rb にします.
まずはじめに,今回考えるバイナリーデータを作成します.
これは,衛星画像をある閾値で二値化したときに得られるデータに相当します.
以下のように打ち込んでください.
imageX = [0,0,0,0,0,
1,1,0,0,1,
0,1,0,0,0,
0,0,0,0,1,
0,0,0,0,0]
imageY = imageX.collect{|x| x*255}
image = imageY.pack("C25")
m = n = 5
r = 2
これは以下のような二値画像を示しています.
Gliding box中の値の総和を求める
次に一辺が2マス分のgliding boxを考え,その中に入る値の総和を求めます.
以下のように入力します
# Gliding_box中の値の総和
# r~Gliding_boxのサイズ
# Gliding_boxの中の数字を一列の文字列(x)にする
# image~もと画像データの名前
# m~もと画像データの横サイズ
# n~もと画像データの縦サイズ
# k~Gliding boxの左上隅の全体の通し番号における番号
# l~Gliding boxの最上段を0行目とカウントしたときのGliding boxの任意の行
def sum_in_box(r,image,m,k)
x = ""
r.times{|l| x += image[k+l*m,r]}
xa = x.unpack("C*")
sum = 0
xa.each{|v| sum += v/255}
return sum
end
Gliding_boxを動かし,box内の値の和の配列を作成
次に,Gliding_boxをスライドさせ,各時々のGliding_box中の値の和を
配列に挿入します.
「Gliding box中の値の総和を求める」で打ったコマンドの下に続けて,
以下のように打ち込んでください.
# Gliding_boxをスライドさせ,各Gliding_box中の値の和を配列(array)に挿入
def scan_box(image,m,n,r)
array = []
(n-r+1).times do |j|
(m-r+1).times do |i|
k = i + j*m
array << sum_in_box(r,image,m,k)
end
end
array
end
平均値,分散,Lacunarityを計算
上で作成した配列(array)の平均値,分散,Lacunarityを計算してみましょう.
上に続けて,以下のように打ち込んでください.
# 配列(array)から平均値,分散,Lacunarityを計算
def lacunarity
require 'mean_var'
mean,var = mean_var(array)
p [mean,var]
lac = var/mean**2 + 1
end
arry = scan_box(image,m,n,r)
p array
lac = lacunarity(array)
p lac
これで,最初に作成したバイナリーデータの平均,分散,Lacunarityを求める
ための式が出来ました.後はrubyで走らせればバイナリーデータの平均,
分散,Lacunarityが分かるはずです.
平均,分散,Lacunarityを見てみよう
上で作ったファイル(lacunarity01.rb)を好きなところに保存してください.次に,コマンドプロンプトを立ち上げ,ファイルの保存先に移動します.
移動したら,以下のようにコマンドプロンプトに打ち込みます.
ruby lacunairty01.rb
すると以下のように表示されるはずです.
以上より次のように表示されます.
今回はここまでになります.お疲れ様でした!!
最終更新:2009年04月14日 11:48