PNM形式

概要

PNMとは、"Portable aNy Map"の略であり、PPM(Portable Pix Map)、PGM(Portable Gray Map)、PBM(Portable Bit Map)の総称。それぞれ、フルカラー、グレースケール、そして、2値画像を扱う。いずれの画像形式も共通の仕様のヘッダの後に、画素値を記述する。

ヘッダ仕様

先頭から、以下に示す順で構成する。

データ情報参考
Pn画像データ仕様固定長文字列(2バイト) 'P'に続けて数字nを記述する。このとき1≦n≦6
'#'で始まる文字列255バイト以内のコメント不定長文字列
col_size row_size画像の横方向のサイズ 画像の縦方向のサイズ不定長文字列。両データの区切りには、スペースを用いる。
qmax量子化レベルの最大値不定長文字列

l(r, c) = f(r, c) * 255/qmax

ファイル上の画素値

画像データは、ヘッダの直後に記述する。 画素値のデータは画像の左から右、上から下の順で記述する。

データ記述方法の違い

 いずれの形式も、8bit値(0~255)で画素値を表す。なおアスキー形式(テキストファイル)のファイルオープンはバイナリ形式でも問題なく動作する。

アスキー形式
画素値をテキストで記述する。不定長文字列となるため、デリミタとしてホワイトスペース(スペース、タブ、改行コード:通常は改行コード)を用いる。データ量は増加するが、エディタで作成できる利便性をもつ。
バイナリ形式
画素値(カラー画像の場合は各原色の強度)に2バイトを割り当てて記述する。全ての画素について固定長データで扱うことができる。

モノクロ画像ファイルのデータ記述

2値画像、およびグレースケール画像のデータは濃度のみであり、座標(縦, 横)=(r,c)の画素値をf(0,0)であらわすとき、 1番目の画像データは、座標(0,0)の画素値f(0,0)である。

プログラミングにおいて画素値を配列(メモリ)上に格納する場合、濃度を、f(r,c) とすると、モノクロ画像のデータは先頭から

f(0,0), f(0,1), f(0,2), …

のように記述している。

カラー画像ファイルのデータ記述

カラー画像のデータは、光の三原色それぞれについてデータの記述が必要である。このとき、座標(r,c)のデータは、三原色それぞれの強度を{赤、緑、青}の順番に記述する。赤、緑、青の強度を、それぞれr(r,c), g(r,c), b(r,c)とすると、 カラー画像ファイルのデータは、先頭から

r(0,0), g(0,0), b(0,0), r(0,1), g(0,1), b(0,1), r(0,2), …

のように記述している。

コンピュータに画像データを読み込むためのプログラミング

以下に示すサンプル・ソースは、引数によってモノクロ画像の濃度、カラー画像の R ,G, B のいずれかを返すプログラムである。RGBすべてを取得する場合は、引数を変えて3回実行する必要があることに注意。

メモリ上の座標について

簡単のため、画像データを格納する配列は、[col_size][row_size]の2次元ではなく[col_size * row_size]の1次元で取得している。座標(縦, 横)=(r,c)を格納する要素番号は、2次元配列の場合[r][c]であるが、1次元配列の場合は[r * col_size + c]となる。

関連リンク

更新履歴


Back / Studying / Top