画像フォーマット

PBM, PGM, PPM

Portable {Bit, Gray, Pix}Map

形式

PNM ... Portable aNy-Map

例:bitmap ascii

P1
# feep.pbm
24 7
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 1 1 1 1 0 0 1 1 1 1 0 0 1 1 1 1 0 0 1 1 1 1 0
0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0
0 1 1 1 0 0 0 1 1 1 0 0 0 1 1 1 0 0 0 1 1 1 1 0
0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0
0 1 0 0 0 0 0 1 1 1 1 0 0 1 1 1 1 0 0 1 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
例:graymap ascii
P2
# feep.pgm
24 7
15
0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
0  3  3  3  3  0  0  7  7  7  7  0  0 11 11 11 11  0  0 15 15 15 15  0
0  3  0  0  0  0  0  7  0  0  0  0  0 11  0  0  0  0  0 15  0  0 15  0
0  3  3  3  0  0  0  7  7  7  0  0  0 11 11 11  0  0  0 15 15 15 15  0
0  3  0  0  0  0  0  7  0  0  0  0  0 11  0  0  0  0  0 15  0  0  0  0
0  3  0  0  0  0  0  7  7  7  7  0  0 11 11 11 11  0  0 15  0  0  0  0
0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
例:pixmap ascii
P3
# feep.ppm
4 4
15
 0  0  0    0  0  0    0  0  0   15  0 15
 0  0  0    0 15  7    0  0  0    0  0  0
 0  0  0    0  0  0    0 15  7    0  0  0
15  0 15    0  0  0    0  0  0    0  0  0
例題:
右方向のドット位置を x 下方向を y として、画素値が 16 * x + y で表されるような 16 × 16 の pgm 画像を作成しなさい。
回答例
#include <stdio.h>

main()
{
  int x,y;

  printf("P2\n16 16\n255\n");
  for (y=0;y<16;y++) {
    for (x=0; x<16; x++) {
      printf("%d\n",16 * x + y);
    }
  }
}
	

Netpbm コマンド群

各種の画像フォーマットから pbm, pgm, ppm への変換。pbm, pgm, ppm, pnm 画像の演算。pbm, pgm, ppm, pnm から各種画像フォーマットへの変換などを行う。

pbm, pgm, ppm, pnm の man を読む。

pbmtext
文字列(ASCII)を pbm ファイルにする
icontopbm
Sunのアイコンエディタで作成したiconファイルを pbm形式に変換する
xbmtopbm
X window の xbm形式を pbm形式に変換する
pbmtopgm
pbm形式を pgm形式に変換する(gray mapになる)
rgb3toppm
3つのpgmファイルをそれぞれ r,g,b に割り当てたカラー画像を作る
pnmarith
画像間で演算をおこなう
ppmquant
カラーの原色をおこなう
ppmtogif
GIF形式の画像に変換する
cjpeg
JPEG形式の画像に変換する

練習

最初は xv を使って、interactive に画像処理をやってみます。
  1. ネットワークで公開されている画像ファイルを拝借してくる。(例えば 情報科学科のサーバなど)
  2. 自分の作業ディレクトリに保存し、ppm へ変換する。
    例えば、 djpeg papageno.jpg > papageno.ppm
  3. 画像の中にマウスカーソルを移動して、中央ボタンを押すと、その位置の画素 の座標、RGB 値、HSV値が表示される。
  4. 右ボタンを押すと、「コントロールウィンドウ」が現れる。
  5. Display, 24/8 bit, Algorithms, Root, Windows, Image Size はそれぞれ メニューになっていて、左ボタンでドラッグする。
  6. 例えば、Windows -> Text View を開くと、画像ファイルに入っている内容を 文字で表示するので、PPM ヘッダを読むことができる。
  7. Windows -> Color Editor を開くと、画像の色を HSV で調製できる。 Saturation と Intensity を変えてみて変化をみてみよう。
  8. 同じウィンドウの右には RGB での調製もできるようになっている。Red と Green を 明るめにすると「セピア色」っぽくなるかもしれない。
  9. 同じように Image Size を使って画像の拡大や縮小をしてみよう。
こんどは、NetPbm コマンドを使って、コマンドでの画像処理をしてみよう。
  1. 画像の縮小
    % pnmscale 0.7 papageno.ppm > p07.ppm
  2. 画像を任意の大きさにスケール
    % pnmscale -width 128 -height 128 papageno.ppm > p128.ppm
  3. 画像から切り取り
    % pnmcut 25 68 50 30 papageno.ppm > pcut.ppm
  4. 画像のつなぎあわせ
    % pnmcat -lr pcut.ppm pcut.ppm > pcat.ppm
  5. 画像を RGB 3成分に分割
    % ppmtorgb3 papageno.ppm
  6. 画像の成分を明るくする
    % pnmgamma 3 papageno.red > p3.red
    % pnmgamma 2 papageno.grn > p2.grn
  7. RGB 成分画像を再合成
    % rgb3toppm p3.red p2.rgn papageno.blu > sepia.ppm
  8. シェルスクリプトを作って他の画像にも適用
    % cat > ppmsepia
    #!/bin/csh
    ppmtorgb3 $1
    pnmgamma 3 $1:r.red > p3.red
    pnmgamma 2 $1:r.grn > p2.grn
    rgb3toppm p3.red p2.grn $1:r.blu > $1:r-sepia.ppm
    \rm *.red *.grn *.blu
    ^D (Ctrl+D)
    % chmod +x ppmsepia
    % ppmsepia mariko.ppm
  9. WWW 用画像形式への変換

最後に、練習でできた画像ファイル(サイズの大きくないものをひとつ) をメールに付けて tkikuchi@is.kochi-u.ac.jp まで送ってください。メールツールでメッセージ作成を選び、宛先、どんな 画像ですというコメントを書いてから、ファイルマネージャに出ている 画像ファイルのアイコンをメッセージ作成ウィンドウにドラッグアンドドロップ します。このとき、コード化しますかという問いがでますので、[コード化]を 選んでください。
このような方法でメールに添付された画像ファイルを復元するには、 メールツールからファイルマネージャにドラッグアンドドロップします。 見るには、xv を起動して表示します。
画像ファイルの添付方法は uuencode という方法を使っています。 UNIX では使えますが、パソコンでは使えないことが多いので、 初めての友達にいきなりこの方法で画像を送り付けたりしないように 注意しましょう。その他の添付方法としては、MIME encoding などが あります。