2012/10/20

文系のための「画像データのメタデータ」

さて、メタデータの重要性を理解できたところで、
実際に、様々なデータのメタデータを扱う方法について考えていく。
今回は、画像データのメタデータの話。

まずは、前回の復習から。メタデータとは要するに何であるか?

「中身を全て見なくても、何となく、中身を知ることができるような、」
「必要最低限の情報」のことであった。

さすがに、これは大丈夫であろう。

では、「必要最低限の情報」とは何か?だれが決めているのか?
実は、これこそが、メタデータの議論において、最も核心的な問題なのである。
結論から言うと、簡単には決められないし、実際に一つには定められない。

例えば、画像の場合には、書誌情報に用いられるメタデータを用いることもあるし、
画像のために定められたメタデータを用いることもある。
また、画像のためのメタデータにも色々と存在しているし、後に拡張されることもある

色々と細かい話をし始めると、色々と混乱するかも知れないので、
ここでは、Exif(イグジフ) と呼ばれる規格について紹介することにする。
このメタデータは、いわゆる国際標準ではないが、静止画像では事実上の国際的標準

Exif というのは、Exchangeable Image file Format の略で、
デジタルカメラスマートフォンスキャナなどの機器で取得された情報の標準規格で、
画像だけでなく、位置に関する情報音声データに関する情報などにも対応している。

元々、富士フィルムが開発した開発した規格であり、
1998年に、一般社団法人日本電子情報技術産業協会(JEITA)が認定した。
その後、この規格は世界的に普及し、現在では殆どのカメラがこの規格に対応している。

日本のカメラ産業の牽引力というか強さというのががよく解る。

さて、Exifが対応している画像形式は、JPEG形式TIFF形式のほか、
WAVと呼ばれる音声ファイルにも対応している。
では、このExifという規格を使うと、どのような情報を得ることができるのか?

実を言うと、ここでは挙げきれないほど、定義されているものが多く
仕様書を見ても、このブログの読者が理解できるようなものでも無い。
正直、私自身、仕様書をちゃんと理解している訳ではないので詳細は省く。

とは言うものの、このまま話を終えてはつまらない。
試しに、Exif 情報を自分で抜き出してみる。以下は、Pythonの場合。

とりあえず、Python 2.7(32bit版は既にインストール済みのこととして、
画像を扱うためのPythonのライブラリを追加インストールする。
インストールするのは、Python Image Library(PIL) というライブラリ。

Windows ユーザは、以下のページから最新のライブラリをダウンロードし、
普通のソフトと同様にインストール。
http://www.pythonware.com/products/pil/

Mac の人は、「Python Imaging Library x.x.x Source Kit (all platforms)」
というのをダウンロードし、Terminal 上で以下のコマンドを実行する。
赤字のところは、利用環境やPILのバージョンに依存するので、適当に修正。

sudo python /Users/username/Downloads/Imaging-1.1.7/setup.py install

Ubuntu の人は、コンソール上で以下のコマンドを実行するだけ。ダウンロードも不要。

sudo apt-get install python-imaging

以上の準備が完了したら、Python を起動する。
Windows の人は、IDLE(Python GUI) というプログラムをし、
MacUbuntu の人は、Terminal 上で Python と入力して実行する。

無事に起動すると「>>>」というのがある。ここに、プログラムを書く。
とにかく、以下のソースコードをそのままコピーアンドペースト
今は、何も考えなくても良い。

# PIL の基本的なライブラリを読み込む。
from PIL import Image
# さらに、EXIFタグを読むためのライブラリも読み込む
from PIL.ExifTags import TAGS

# 与えられたファイルのEXIFを読み取る
def get_exif(filename):
     ret = {}
     i = Image.open(filename)
     info = i._getexif()
     for tag, value in info.items():
         decoded = TAGS.get(tag, tag)
         ret[decoded] = value
     return ret

上記を貼付けたら、「>>>」が表示されるまでエンターキーを押下する。
ここで貼付けたものが、いわゆる、プログラミングのソースコード。
プログラムを書く人は、この部分を一生懸命に書いているのである。

さて、ユーザとして理解すべき部分は「def get_exif(filename):」の一行だけ。
def」は「define(定義)」の略で、「get_exif」という機能を定義している。
filename」がこの機能を実行するために必要な「値」。要するに、画像ファイルのパス

以上のことが解れば、今の段階では大丈夫。

以下にサンプル写真を置いてあるので、これを使うことにする。
私が撮影したもの。「CC BY 3.0」で共有することにしよう。
クレジットさえ有れば、商用利用も含めて何でもOKということで。

https://docs.google.com/open?id=0B9OtIs5BjRVhOGttM3ZzZ0FMNjg

適当なディレクトリにダウンロードしたら、以下のコマンドを実行する。
先ほどの「filename」の部分をダウンロードした画像のパスに置き換ただけ
大文字と小文字の区別、余計なスペースに注意する。これらがエラーの原因。

以下をコピーアンドペーストして修正するのが楽であろう。

# ダブルクォーテーションの間に画像のパスを指定する。
# 一旦、結果を「res」という変数に格納しておく。
res = get_exif("/Users/username/Desktop/CIMG2713.JPG")

どこにダウンロードしたかによって赤字の部分は異なる。
さて、何も怪しげなメッセージが出てこなければ成功。
次に、どのようなタグが入っているかを確認してみる。

dict.keys(res)

この一行をコピペして実行すると、以下のような結果が表示される。

>>> dict.keys(res)
['LightSource', 'YResolution', 'ResolutionUnit', 41987, 41988, 41989, 41990, 41991, 41992, 41993, 'Make', 'Flash', 41986, 'DateTime', 'MeteringMode', 'XResolution', 50341, 'ExposureProgram', 'ColorSpace', 'ExifImageWidth', 'DateTimeDigitized', 'DateTimeOriginal', 'MakerNote', 'Software', 41994, 'CompressedBitsPerPixel', 'FNumber', 41985, 'FocalLength', 'ComponentsConfiguration', 'ExifOffset', 'ExifImageHeight', 'ISOSpeedRatings', 'Model', 'Orientation', 'ExposureTime', 'FileSource', 'MaxApertureValue', 'ExifInteroperabilityOffset', 'FlashPixVersion', 'YCbCrPositioning', 'ExifVersion']

何やら、複雑なものが出てきた。しかし、ここで目を背けてはいけない。
良く見ると、なんとなく想像できそうなものがある。
例えば、「DateTimeOriginal」は、撮影日時である。今度はこの値を確認してみる。

res["DateTimeOriginal"]

この実行は以下の通り。

>>> res["DateTimeOriginal"]
'2012:07:22 15:48:27'

つまり、この写真は、2012年7月22日の15:48:27に撮影されたもの。
この値が正確かと言われると、それは、カメラの時刻の合わせ方次第
ちゃんと設定していれば、秒単位で、正確な撮影時刻が解るのである。

ついでに、この写真を撮影したカメラメーカーモデルの情報も見てみる。
同様に、以下をコピーアンドペースト。

res["Make"]
res["Model"]

そして、このコマンドの実行結果は以下の通り。

>>> res["Make"]
'CASIO COMPUTER CO.,LTD.'
>>> res["Model"]
'EX-FH100   '

CanonEX-FH100というカメラで撮影したということが解る。
他にも、焦点距離ISOシャッタースピードなどの情報も得ることが出来る。
これらの情報を上手く使うと、様々なことが自動化できるのである。

例えば?

Exif Print というのがある。これは、Exif に書き込まれた情報を用いて、
撮影当時の状況を分析し、その状況に最適化して写真を印刷するというもの。
対応しているカメラとプリンタを組み合わせると美しい写真に仕上がるのである。

他にも、Exif 情報を使って、撮影した画像をカメラのモデル毎にフォルダに移動し、
さらに、そのフォルダ内で日付ごとに分類することもできる。
もちろん、日付で分けて、その中を機種で分けることも可能。

そういった機能は、カメラに付属する専用ソフトで実現することもできるのであるが、
先ほどの Python のプログラムを、「ちょちょい」と修正するだけでも実現可能。
対して、難しい話ではない。時間に余裕が出来た時にでも作ってみようか。

まぁ、いいや。今回はここまで。では、最後のまとめに。

今回の写真の例では、位置情報が付いていなかったが、
GPSなどのGNSS技術と連動していれば、地図上の位置と画像を関連付け、
調査で利用した写真から直接的に空間データベースの構築が可能となる。

音声ファイル位置情報画像とその他のExif に書き込まれている情報から、
非常に多様な情報を持ったデータベースの自動構築ができる
データ取得時に、メタデータを入れるためのわずかな手間さえ惜しまなければ...

0 件のコメント:

コメントを投稿