グレースケールとは
コンピュータ上での色の表現方法の一つ。画像を白から黒までの明暗だけで表現し、色の情報は含まない「モノクロ」のこと。灰色を何階調で表現するかをビット数によって表す。1ビットの場合は白と黒のみで中間色がない状態で、8ビットなら(白と黒を含めて)256階調、16ビットなら65536階調の灰色で表現する。
今回は8bitで表現されている.階調が小さいほど黒く,大きいほど白い.
使用データ
今回は衛星画像データ (LANDSATデータ) を扱います。
(O:)ドライブ → 地図データ → LANDSAT → LANDSAT7ETM+109-36_20010704
以前作成したimage_cut.rbを使います.
以下のフォルダにおいてあるimage_cut.rbを自分の好きな作業スペースにコピーします.
O:\地図データ\LANDSAT\LANDSAT7ETM+109-36_20010704\SCENE001
image_cut.rbの名前をimage_cut01.rbに変更してください
image_cut.rbの詳しい説明はワークショップ内の
Ruby "2008/11/18 バイナリーデータを読もう"
に記載されているので参考にしてください.
衛星画像処理
image_cut01.rbを立ち上げてください.
以下に取ってきたばかりのimage_cut01.rbを示しました.
dir = "O:/地図データ/LANDSAT/LANDSAT7ETM+109-36_20010704/SCENE001/"
################################################################################
# 必要な場所を切り出す
def cut_site(f,out)
cols = 6937 # LANDSAT画像の一行のピクセル数
x1 = 3100; y1 = 2600 # 切り出したい位置の左上隅
x2 = 3300; y2 = 2850 # 切り出したい位置の右下隅
dx = x2 - x1; dy = y2 - y1
out.puts "P5 #{dx} #{dy} 255"
y2.times do |j|
line = f.read(cols)
out.write(line[x1,dx]) if j >= y1
end
end
out_file = ["B10","B20","B30","B40","B50","B61","B62","B70"]
i = 0
Dir.foreach(dir) do |file|
if /B/ =~ file && /B80/ !~ file
puts file
f = open(dir + file,"rb") # 対象ファイル(バイナリ)をオープン
out = open(out_file[i] + ".ppm","wb")# 出力ファイル(バイナリ)を準備
# 必要な場所を切り出す
cut_site(f,out)
f.close; out.close
i += 1
end
end
これは考えている範囲が大きいため,今回は画像をさらに小さい範囲で切り取ります.
以下のように訂正します.
dir = "O:/地図データ/LANDSAT/LANDSAT7ETM+109-36_20010704/SCENE001/"
################################################################################
# 必要な場所を切り出す
def cut_site(f,out)
cols = 6937 # LANDSAT画像の一行のピクセル数
x1 = 3050; y1 = 2650 # 切り出したい位置の左上隅
x2 = 3250; y2 = 2850 # 切り出したい位置の右下隅
dx = x2 - x1; dy = y2 - y1
out.puts "P5 #{dx} #{dy} 255"
y2.times do |j|
line = f.read(cols)
out.write(line[x1,dx]) if j >= y1
end
end
out_file = ["B10","B20","B30","B40","B50","B61","B62","B70"]
i = 0
Dir.foreach(dir) do |file|
if /B/ =~ file && /B80/ !~ file #Bを含んだものを探す.
puts file
f = open(dir + file,"rb") # 対象ファイル(バイナリ)をオープン
out = open(out_file[i] + ".ppm","wb")# 出力ファイル(バイナリ)を準備
# 必要な場所を切り出す
cut_site(f,out)
f.close; out.close
# PNGファイルに変換
command = "convert #{out_file[i]}.ppm #{out_file[i]}.png" #image magickのコマンド(convert)を定義します
system(command) #上記のコマンドを使います
i += 1
end
end
訂正した後,コマンドプロンプトを立ち上げてください.
作業するディレクトリに入ってください.
先ほど訂正したimage_cut01.rbをrubyではしらせます.
ruby image_cut01.rb
作業しているディレクトリ内に8個のppmとpngファイルが出来ているのを確認してください
出来たファイルを実際にPaintshopなどであけて,ちゃんとバイナリーデータから画像が
出来ているか確認してください.
ちゃんと見ることが出来れば問題ないです.
グレースケールを見る
先ほど出来たB30.ppmのグレースケール(ピクセルごとに与えられている明暗を表す値)を見てみます.
新しくEditorを立ち上げてください.
名前はlac.rbとしてください.
以下のようにlac.rbに打ち込みます
#B30.ppmからデータを持ってくる
file = "B30.ppm" #入力するファイル
out_file = "B30b.ppm" #出力するファイル,2値化になっている
f = open(file,"rb") #fileをオープン
out = open(out_file,"wb")
f.gets #fから一行読み取って描きなさい
str = f.read(40000).unpack("C*") #fから40000個読み込みなさい
#文字を読み取って,バイナリーの文字を読める文字に変換した
#読み込んだグレースケールの各値が何個ずつあるかを表示する
dn = [] #dnという入れ物(ハッシュ)を作った
str.each do |x|
dn[x] = 0 if dn[x] == nil
dn[x] += 1
end
dn.keys.sort.each do |x| #それぞれの値の個数を小さい順に並べる
printf "%d: %d\n",x,dn[x]
end
各グレースケール値の出現頻度を見る
lac.rbに打ち込み終わったら保存してください.
次にコマンドプロンプトでlac.rbをはしらせてみます
ruby lac.rb
※なお、ここではB30b.ppmファイルは空っぽです
すると以下のような数字が流れると思います.
これは左の数字がグレースケールを表しています.
右の数字はその値のグレースケールの個数を表しています.
最終更新:2009年03月27日 12:44