GRASSによる画像解析
筑波大学農林工学系 奈佐原(西田)顕郎
これまでは, C言語でいちいちプログラムを組んで画像解析をやってみた。このようなやりかたは, 科学的・技術的な研究開発において, 最も本道を行くものであり, 基礎技術として重要である。しかしながら, C言語によるプログラミングは, 開発効率という点ではいまひとつであり, 我々は, もっと楽に便利にさまざまなことをさくっとやりたい, と思うのだ。そのために, 世の中にはさまざまな画像解析ソフトが出回っている。その中から, GRASSを使って, 画像解析をやってみよう。
GRASSはGeographic Resources Analysis Support Systemの略であり, 本来は地理情報システム(GIS)であって, 画像解析ソフトではない。しかし, GISの機能の多くは, 画像解析である。たとえば人工衛星画像や空中写真は, GISの解析対象となるデータだが, これらの解析の一部は, 画像解析そのものと言っても過言ではない。それどころか, GISは, 一般の画像処理ソフトよりも, 自由度が高く, 高度な解析もできてしまう。
なによりも素晴らしいのは, GRASSはオープンソースソフト(FOSS)である, ということだ。
GRASSの起動と設定
では, 実際にGRASSで画像解析をやってみよう。GRASSは, 現在の多くのLinuxディストリビューション(SUSE, Fedora, Ubuntu等)では標準的にパッケージが用意されており, コマンドひとつで簡単にインストールできる。諸君が使っているLinux端末にも既にGRASSは入っているだろう。
GRASSは, 以下のようにすれば起動できる:
$ grass -text 起動できない場合は, $ sudo apt-get install grass でgrassをインストールすること。
LOCATIONの初期設定
GRASSを起動すると, まず, コンソールに以下のような表示があらわれる:
GRASS 6.4.4 DATABASE: A directory (folder) on disk to contain all GRASS maps and data. LOCATION: This is the name of a geographic location. It is defined by a co-ordinate system and a rectangular boundary. MAPSET: Each GRASS session runs under a particular MAPSET. This consists of a rectangular REGION and a set of maps. Every LOCATION contains at least a MAPSET called PERMANENT, which is readable by all sessions. The REGION defaults to the entire area of the chosen LOCATION. You may change it later with the command: g.region - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LOCATION: XY_______________________ (enter list for a list of locations) MAPSET: PERMANENT________________ (or mapsets within a location) DATABASE: /home/gis/__________________________________________________ AFTER COMPLETING ALL ANSWERS, HIT <ESC><ENTER> TO CONTINUE (OR <Ctrl-C> TO CANCEL)
ここでは,
LOCATION .... XY MAPSET ...... PERMANENT DATABASE .... /home/gis/ ... 諸君のホームディレクトリ 例) /home/s10?????/
のように入力しよう。項目の移動はENTERキー。打ち間違いは上書きして修正。消したいときはBackSpaceやDELを使わないでスペースキーで書き潰す。
入力ができたら, ESCAPE, ENTER。するとつぎのように聞かれる:
Would you like to create location <latlon> ? (y/n)
当然, yでENTER。するとつぎのように聞かれる:
To create a new LOCATION, you will need the following information: 1. The coordinate system for the database x,y (for imagery and other unreferenced data) Latitude-Longitude UTM 2. The zone for the UTM database and all the necessary parameters for projections other than Latitude-Longitude, x,y, and UTM 3. The coordinates of the area to become the default region and the grid resolution of this region 4. A short, one-line description or title for the location Do you have all this information for location <latlon> ? (y/n)
たいしたことは言ってない。yでENTER。すると, 次のように聞かれる:
Please specify the coordinate system for location <latlon> A x,y B Latitude-Longitude C UTM D Other Projection RETURN to cancel
ここではAを選んでENTERを押す。
このあたりのメッセージは, GRASSを本来のGISとして使うための詳細な設定のためのものだが, ここでは我々はGRASSを 単なる画像解析ソフトとして使うだけだから, あまり深く考える必要はない。
すると,
x,y coordinate system? (y/n) [y]
当然, yでENTER。すると,
Please enter a one line description for location <latlon> >
なんかメモを入れていいよ, ということなので, 何も入れずに単にENTERでも良し。すると,
===================================================== ===================================================== ok? (y/n) [n]
けっこうくどい。yでENTER。次の画面は,
DEFINE THE DEFAULT REGION ====== DEFAULT REGION ======= | NORTH EDGE:1000______ | | | WEST EDGE | |EAST EDGE 0_________ | |1000______ | SOUTH EDGE:0_________ | ============================= PROJECTION: 3 (Latitude-Longitude) ZONE: 0 GRID RESOLUTION East-West: 1_________ North-South: 1_________ AFTER COMPLETING ALL ANSWERS, HIT <ESC><ENTER> TO CONTINUE (OR <Ctrl-C> TO CANCEL)
と入れる(ていうか, 適当でよい)。その後, Do you accept this region? (y/n) [y] と聞かれるが, ここもyでENTER。最後に上と同様の確認画面がもういちどあらわれるが, ESC, ENTER。すると, コンソールにはGRASSのプロンプトが表示される:
GRASS 6.4.4 (XY):~ >
以下の記述では, GRASSのプロンプトを下記のように略記する。
GRASS >
GRASSもUNIXシェルである
このGRASSのプロンプトのもとでも, UNIXのコマンドを実行することもできる。というよりもむしろ, この環境は, UNIXのシェルに, GISや画像解析に必要な機能(コマンドなど)を追加したものであり, 従って, 普通にUNIXのシェルでできることは(シェルスクリプトもawkも標準入出力のリダイレクトやパイプも何もかも)ほとんどなんでもできるのである。
以下のような操作をして, 普通のUNIXシェルとかわらない結果が出ることを確認せよ:
GRASS > ls GRASS > pwd
画像の読み込みと表示
lake.jpgを読み込んでみよう:
GRASS > r.in.gdal input=lake.jpg output=lake
こうすると, lake.jpgの, red, green, blueの3つのチャンネルが, それぞれlake.red, lake.green, lake.blueという名前の「マップ」として読み込まれる。
ではこれを表示してみよう:
GRASS > d.mon x0 GRASS > g.region rast=lake.red GRASS > d.rast lake.red
カラー合成は簡単である。以下のように, d.rgbというコマンドを使うだけだ:
GRASS > d.rgb red=lake.red green=lake.green blue=lake.blue
GRASS > d.rgb red=lake.blue green=lake.green blue=lake.red
画像を明るくしたり暗くするには, カラーテーブルという考え方を使えばよい。カラーテーブルとは, 画像の各ピクセルの数値に対して, どのように表示色を割り当てるかの, 対応関係である。ここで扱っているような1バイト非負整数値(0から255まで)の場合, 白黒だと, ゼロに黒を, 255に白を割り当てるのが普通だが, そこをあえて, 255の半分くらい以上を白にしてしまえば, 画像は白っぽくなる。これを, 三原色のそれぞれのマップに対して行ってからカラー合成すれば, 明るい画像になる:
GRASS > r.colors map=lake.red color=rules << EOF 0 black 127 white 255 white EOF GRASS > r.colors map=lake.blue rast=lake.red GRASS > r.colors map=lake.green rast=lake.red GRASS > d.rgb red=lake.red green=lake.green blue=lake.blue
フィルター処理
ラプラシアンフィルター
GRASS > r.mapcalc "lake.red_L=(lake.red[0,1]+lake.red[1,0]+lake.red[0,-1]+lake.red[-1,0]-4*lake.red[0,0])" GRASS > r.colors map=lake.red_L color=grey GRASS > d.rast lake.red_L
平均化フィルター
GRASS > r.mapcalc "x=lake.red" GRASS > r.mapcalc "lake.red_M=(x[0,1]+x[1,0]+x[0,-1]+x[-1,0]+x[1,1]+x[1,-1]+x[-1,1]+x[-1,-1]+x[0,0])/9" GRASS > r.colors map=lake.red_M rast=lake.red GRASS > d.rast lake.red_M
Keyword(s):
References:[画像解析入門]