バイナリデータの扱い方

バイナリに関しては(http://ja.wikipedia.org/wiki/バイナリ)を参照
バイナリデータで構成されているファイルをバイナリファイルと言います.
バイナリファイルの例としてTIFFやJPEGがあります.
これらのファイルの先頭にはメタデータ (ヘッダ) が付加されています.(例:EXIF)
デジカメのメタデータには撮影日時, 撮影機器メーカー, 撮影機器モデル名, シャッター速度, ISO感度, 露出補正値などが記録されます.


今回は衛星画像データ (LANDSATデータ) を扱います。
(O:)ドライブ → 地図データ → LANDSAT → LANDSAT7ETM+109-36_20010704

  • LANDSAT7 : NASAなどが打ち上げている人工衛星の7号機
  • ETM+ : Enhanced Thematic Mapper Plus http://www.eorc.jaxa.jp/hatoyama/satellite/sendata/etm_j.html
  • 109 : ルート番号 (Column number) 南北方向
  • 36 : コマ番号 (Line number) 東西方向
  • 20010704 : 撮影した日付 (2001年7月4日)

SCENE001をクリックしてください.
可視光
L71109036_03620010704_B10 : 青 (Band1)
L71109036_03620010704_B20 : 緑 (Band2)
L71109036_03620010704_B30 : 赤 (Band3)
L71109036_03620010704_B40 : 近赤外 (Band4)
L71109036_03620010704_B50 : 中間赤外 (Band5)
L71109036_03620010704_B61 : 熱赤外 (Band6)
L71109036_03620010704_B62 : 熱赤外 (Band6)
L71109036_03620010704_B70 : 中間赤外 (Band7) → B50とは波長が異なる
L71109036_03620010704_B80 : パンクロ (Band8) → 解像度が粗い

太陽光の地表からの反射を観測 → 可視光, 近赤外, 中間赤外, パンクロ
物体自身からの放射を観測 → 熱赤外

衛星データのヘッダ情報

11行目を見ると横6937, 縦6316のピクセル数であることがわかります.
13行目を見ると1ピクセル当たりのビット数が8となっているのがわかります.
8ビット = 256 (2の8乗) = 1バイトに相当します.
256コ (0~255)のカラー値を表現できます.

(D:)ドライブに作業用フォルダ(Landsat)を作ります.
(O:)ドライブのBand1とBand4のデータを作成した作業用フォルダにコピーします.
名前が長いのでそれぞれ「blue」と「nir」に変更します.
コマンドプロンプトを開きます.
まずは「blue」のデータに関して
cd D:\Landsat
cat > blue.ppm
P5 6937 6316 255
CTRLキー + C を押します.
cat blue >> blue.ppm
プロパティを見るとblue.ppm(43814110バイト), blue(43814092バイト)のそれぞれのファイルサイズが分かります.
ヘッダ情報を加えた分、blue.ppmのほうが18バイト大きいです.

続いて「nir」のデータに関して
cat > nir.ppm
P5 6937 6316 255
CTRLキー + C を押します.
cat nir >> nir.ppm

「cat」は数行のテキストファイルを作りたい時に便利です.

衛星画像処理

研究する対象地域によって衛星画像から研究に必要な一部分を切り出す必要があります.
(画像は容量が大きいため少しでも容量を減らしたほうがいいです)
今回はBand8 (パンクロ) を除いたBandについて同じ地域を切り出します.
エディタを立ち上げてください.
Rubyのスクリプトを使います.
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
ファイル名をimage_cutとして保存してください.(このページの下に添付しています)
コマンドプロンプトに戻り,Rubyスクリプトを実行します.
  • ruby image_cut.rb
8コのファイルが作業用フォルダ(Landsat)に作成されます.
これらを全て開くと以下のような画像が表示されます.

Band1(B10)

Band2(B20)

Band3(B30)

Band4(B40)

Band5(B50)

Band6(B61)

Band6(B62)

Band7(B70)
B61とB62の画像がぼんやりしているのは解像度の違いによるものです.

今回の作業は以上です.お疲れ様でした.

タグ:

+ タグ編集
  • タグ:
最終更新:2008年11月21日 13:49