グレースケールとは

コンピュータ上での色の表現方法の一つ。画像を白から黒までの明暗だけで表現し、色の情報は含まない「モノクロ」のこと。灰色を何階調で表現するかをビット数によって表す。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ファイルは空っぽです

すると以下のような数字が流れると思います.


29:1
31:1
32:2
33:4
34:4

これは左の数字がグレースケールを表しています.
右の数字はその値のグレースケールの個数を表しています.

タグ:

+ タグ編集
  • タグ:
最終更新:2009年03月27日 12:44