とらりもんHOME  Index  Search  Changes  Login

とらりもん - 画像解析入門: 画像のフォーマット Diff

  • Added parts are displayed like this.
  • Deleted parts are displayed like this.

前章で, 画像のフォーマットをいろいろ紹介しましたが, 実際にそれらを試してみましょう。

まず, 下の画像を右クリックして「名前をつけて画像を保存」などのメニューを選ぶことによって, 自分のPCのハードディスクに"lake.jpg"というファイル名で保存して下さい:

{{attach_view(lake.jpg)}}

ちなみにここに写っているのは北海道のオンネトーという湖です。

では, コンソールで,

    $ gimp lake.jpg

として, この画像をGIMPで表示して下さい。下記のような感じの画面になるはずです。なお, GIMPを最初に使うときは, システムが自動的にいろんな設定をしますので, いくつか質問に答えたりしなければなりませんが, そのあたりは適当にやってください。

{{attach_view(gimp.png)}}

また, gimpの使いかたについては, [[こちら|http://www.wakayama-u.ac.jp/~tokoi/lecture/shori1/07.html]]が大変に参考になります。

!!画像の拡大縮小

ではこの状態で, 写真を右クリックし, 「画像→拡大縮小」を選んで下さい(下記):


{{attach_view(gimp2.png)}}

すると下記のようなウィンドウが現れます(システムやバージョンによって若干違います):

{{attach_view(gimp3.png)}}

ここで, 新しい幅を400にして, 高さの欄にカーソルを持って来ると, 高さの値が自動的に300になります。そうして了解を押すと, 小さな画像になります:

{{attach_view(gimp4.png)}}

!!JPEG画像と圧縮率

この画像を右クリックして, 「ファイル→別名で保存」を選び, "lake-small.jpg"という名で保存してみましょう。このとき, 以下のような画面が出てきます(システムやバージョンによって若干違います):

{{attach_view(gimp5.png)}}

この「パラメータ設定」の欄の「品質」とは, JPEG形式の圧縮においてどのくらい情報を切り落としてデータを小さくするかを決めるための数値で, ゼロから1の値をとります。ゼロに近い程, 情報の脱落は大きく, 画質は悪くなりますが, データサイズは小さくなります。1に近い程, 情報の脱落は小さく, 画質は良くなりますが, データは小さくなりません。ためしに品質を0.75のままで保管してみて, $ ls -lでファイルサイズを調べて下さい:

    $ ls -l lake*
    -rw-rw-r--    1 nishida    nishida       21087  6月  5 19:51 lake-small.jpg
    -rw-rw-r--    1 nishida    nishida       80981  6月  5 19:53 lake.jpg

もともとの画像(lake.jpg)に較べて, 約1/4のデータ量になったことがわかります。これは, 単純に言うと, 横と縦のピクセル数がそれぞれ半分になった結果, 横×縦は1/4になったためです。

では, この画像をこんどは"lake-small2.jpg"というファイル名で, 品質25%にして保存してみて下さい。ファイルサイズはどうなったでしょうか?

    $ ls -l lake*
    -rw-rw-r--    1 nishida    nishida       21087  6月  5 19:51 lake-small.jpg
    -rw-rw-r--    1 nishida    nishida        8243  6月  5 19:58 lake-small2.jpg
    -rw-rw-r--    1 nishida    nishida       80981  6月  5 19:53 lake.jpg

先の品質75%の"lake-small.jpg"に較べて, サイズは半分以下になったことがわかります。以下にこの2つの画像を一緒に表示します:

{{attach_view(lake-small.jpg)}}
... 品質75%(lake-small.jpg)

{{attach_view(lake-small2.jpg)}}
... 品質25%(lake-small2.jpg)


ぱっと見たかんじではすぐに違いはわかりづらいですが, 中央の森のあたりは明らかに画質が違います。奥の山の輪郭も, 品質25%ではぼやけてしまっています。

このように, JPEG画像には「品質」というパラメータがあり, それによって画質とデータサイズのどちらをどの程度, 優先するか, ということをユーザーが決める仕組みになっています。
注意: JPEGに限らず, データ圧縮では, どのくらい圧縮できるか(圧縮効率)は, データの種類や性質に大きく依存します。単調または規則的なデータはよく圧縮できますが, 複雑なデータはあまり圧縮できません。

!!PNG, BMP, TIFF, PNM

次にこんどは, 可逆圧縮および非圧縮のフォーマットを試してみましょう。

まず, "lake.jpg"を再びgimpで開き, こんどは縮小などをしないで, そのまま画像を右クリックして「ファイル→別名で保存」を3回行うことで, 画像を以下の3種類のファイル名で保存して下さい:

    lake.png   (PNG形式:可逆圧縮)
    lake.bmp   (BMP形式:非圧縮)
    lake.tif    (TIFF形式:非圧縮)
    lake.ppm   (PNM形式:非圧縮)

(ppmというのは, PNM形式の一種)

そして$ ls -lでファイルサイズを確認すると, 以下のようになっていますか?

    $ ls -l lake*
    -rw-r--r--    1 nishida  nishida     1440054  6月  5 20:10 lake.bmp
    -rw-r--r--    1 nishida  nishida       80981  6月  5 19:53 lake.jpg
    -rw-r--r--    1 nishida  nishida      674134  6月  5 20:10 lake.png
    -rw-r--r--    1 nishida  nishida     1440054  6月  5 20:10 lake.ppm
    -rw-r--r--    1 nishida  nishida     1440368  6月  5 20:10 lake.tif

もともとのlake.jpgに較べて, PNGという可逆圧縮で保存したlake.pngは10倍近いデータサイズになってしまいました。データサイズを小さくするという目的では, JPEGのような非可逆圧縮がいかに強力なものかがよくわかります。

ところが, 非圧縮のBMPやTIFF, PPMで保存した場合(lake.bmp, lake.tif, lake.ppm)は, さらにその倍以上のデータサイズになっています。この2つのファイルサイズはとても近い値であることに気づきましたか? 3つとも, 約1440000バイトになっています。

この大きさは, 先に述べた式で決まっているのです。つまり, この場合, 画像の横のピクセル数は800, 縦のピクセル数は600で, カラーの1ピクセルは3バイト(RGB3原色に各1バイト)とすると,

800 × 600 × 3 = 1440000

となるわけです。圧縮されていない画像データは, このように単純な計算でファイルサイズが決まります。このことを利用して, ファイルサイズをチェックすることで, 様々な処理がうまくいっているかいないかを調べることもできます。

!!ヘッダー情報

ところで, ここで調べたlake.bmp, lake.tif, lake.ppmという3つのファイルが, 正確に1440000バイトにならず, それよりもわずか余分があるのはなぜでしょうか? 実は, その余分は, 画像のフォーマット自体に関する情報です。そのような情報は, 一般的に画像データの先頭に記述されるので, 「ヘッダー」とか「ヘッダー情報」と呼ばれます。

ためしにlake.ppmのヘッダーを見てみましょう。1440054のうちの最初の54バイトがヘッダーであると見当をつけて(このような推測というか, いわば「ノリ」はコンピューターの習得において重要です), その部分まず切り出します:

    $ dd ibs=54 count=1 < lake.ppm > head.txt

このddというコマンドは, バイナリーファイルの一部を切り出したりするときによく使うので, 覚えておいて下さい。コマンドの使いかたについての詳しい説明は, $ man ddのようにしてオンラインマニュアルを見て下さい。

このコマンドの結果, lake.ppmのヘッダー情報はhead.txtというファイルに入ったはずです。その中を見てみましょう:

    $ cat head.txt
    P6
    # CREATOR: GIMP PNM Filter Version 1.1
    800 600
    255

これらの記述の意味は, 以下のとおりです(参考)

    1行目: 画像の種類
      P1 ・・・ 白黒2値画像     (ASCII形式)
      P2 ・・・ モノクロ濃淡画像 (ASCII形式)
      P3 ・・・ RGBカラー画像    (ASCII形式)
      P4 ・・・ 白黒2値画像     (Binary形式)
      P5 ・・・ モノクロ濃淡画像 (Binary形式)
      P6 ・・・ RGBカラー画像    (Binary形式)
    2行目: #からはじまる, コメント行。
    3行目: 画像の横ピクセル数と縦ピクセル数
    4行目: データの最大値

!!rawバイナリーファイル

アプリケーションソフトを使わないで画像をいろいろと解析するには, 多くの場合, まず, 画像を非圧縮の状態で, しかもヘッダーもついていない状態にすることが必要です。そのような状態の画像ファイルのことを, {{fontc(rawバイナリーファイル, red)}}と呼びます。rawは「生」, つまり何も余分なことをされていない状態, という意味です。

では上の画像のrawバイナリーファイルを作ってみましょう。それには例えば, lake.ppmから, ヘッダー情報(54バイト)を削除すればよろしい。これにもddコマンドを使います:

    $ dd ibs=54 skip=1 < lake.ppm > lake.raw

先ほどのddコマンドとよく似た使いかたですが, どこがどう違うか, 考えてみて下さい。

こうして作られたlake.rawは, rawバイナリー, つまり, ヘッダーを全く含まない非圧縮ファイルのはずなので, ファイルサイズは正確に1440000バイトのはずです。そうなっているか, 確かめて下さい。