画像フォーマット
PBM, PGM, PPM
Portable {Bit, Gray, Pix}Map
形式
- マジックナンバー
- P1 ... bitmap (ASCII)
- P2 ... graymap (ASCII)
- P3 ... pixmap (ASCII) カラー
- P4 ... bitmap (Binary)
- P5 ... graymap (Binary)
- P6 ... pixmap (Binary) カラー
- # で始まるコメント(optional)
- 幅 高さ
- 最大値 (gray,pix)
- データ
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 に画像処理をやってみます。
- ネットワークで公開されている画像ファイルを拝借してくる。(例えば
情報科学科のサーバなど)
- 自分の作業ディレクトリに保存し、ppm へ変換する。
例えば、 djpeg papageno.jpg > papageno.ppm
- 画像の中にマウスカーソルを移動して、中央ボタンを押すと、その位置の画素
の座標、RGB 値、HSV値が表示される。
- 右ボタンを押すと、「コントロールウィンドウ」が現れる。
- Display, 24/8 bit, Algorithms, Root, Windows, Image Size はそれぞれ
メニューになっていて、左ボタンでドラッグする。
- 例えば、Windows -> Text View を開くと、画像ファイルに入っている内容を
文字で表示するので、PPM ヘッダを読むことができる。
- Windows -> Color Editor を開くと、画像の色を HSV で調製できる。
Saturation と Intensity を変えてみて変化をみてみよう。
- 同じウィンドウの右には RGB での調製もできるようになっている。Red と Green を
明るめにすると「セピア色」っぽくなるかもしれない。
- 同じように Image Size を使って画像の拡大や縮小をしてみよう。
こんどは、NetPbm コマンドを使って、コマンドでの画像処理をしてみよう。
- 画像の縮小
% pnmscale 0.7 papageno.ppm > p07.ppm
- 画像を任意の大きさにスケール
% pnmscale -width 128 -height 128 papageno.ppm > p128.ppm
- 画像から切り取り
% pnmcut 25 68 50 30 papageno.ppm > pcut.ppm
- 画像のつなぎあわせ
% pnmcat -lr pcut.ppm pcut.ppm > pcat.ppm
- 画像を RGB 3成分に分割
% ppmtorgb3 papageno.ppm
- 画像の成分を明るくする
% pnmgamma 3 papageno.red > p3.red
% pnmgamma 2 papageno.grn > p2.grn
- RGB 成分画像を再合成
% rgb3toppm p3.red p2.rgn papageno.blu > sepia.ppm
- シェルスクリプトを作って他の画像にも適用
% 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
- WWW 用画像形式への変換
- JPEG形式 ... cjpeg コマンドを使う
% cjpeg sepia.ppm > sepia.jpg
- Progressive Mode ... -progressive オプション
% cjpeg -progressive sepia.ppm > sepia-p.jpg
- サイズを小さくする(画質が落ちる)
% cjpeg -q 40 sepia.ppm > sepia50.jpg
- GIF形式 ... 256色までしか表現できないので、減色の必要がある。
% ppmquant 256 sepia.ppm | ppmtogif > sepia.gif
- 色の境界を点でぼかす(dither)
% ppmquant -fs 256 sepia.ppm | ppmtogif > sepia-fs.gif
- 色数を減らすと画質は落ちるが画像ファイルのサイズは小さくなる。
% ppmquant -fs 16 sepia.ppm | ppmtogif > sepia16.gif
- 特定の色を透明にすることもできる。
% pbmtext "Hello" | ppmtogif -transparent #ffffff > hello.gif
最後に、練習でできた画像ファイル(サイズの大きくないものをひとつ)
をメールに付けて tkikuchi@is.kochi-u.ac.jp
まで送ってください。メールツールでメッセージ作成を選び、宛先、どんな
画像ですというコメントを書いてから、ファイルマネージャに出ている
画像ファイルのアイコンをメッセージ作成ウィンドウにドラッグアンドドロップ
します。このとき、コード化しますかという問いがでますので、[コード化]を
選んでください。
このような方法でメールに添付された画像ファイルを復元するには、
メールツールからファイルマネージャにドラッグアンドドロップします。
見るには、xv を起動して表示します。
画像ファイルの添付方法は uuencode という方法を使っています。
UNIX では使えますが、パソコンでは使えないことが多いので、
初めての友達にいきなりこの方法で画像を送り付けたりしないように
注意しましょう。その他の添付方法としては、MIME encoding などが
あります。