みんな大好きPGM
こんばんは。今宵も絶賛残業中だった画処理おじさんです。😅
突然ですが、組込みソフト開発現場の皆さん!画像ログを残す時、どんなフォーマットをご使用してますでしょうか?私がお勧めしているのは、PGMというフォーマットです。
かゆいところに手が届く、いいやつなんです!かれこれ20年来の付き合いです。
まえがき
弊社ではデバッグ中の画像保存する場合、一般的にはRAWを使っています。しかし、このRAWですが、保存する時のC/C++のコードはすこぶる単純ですが、画像ビューワで開く時、いちいちサイズだの深さだの入力するのが面倒なんですよね。かと言って、PNGやJPG等の一般的なフォーマットでの保存となると、OpenCVなどのライブラリが必要になってきます。けれども環境によってはライブラリが使えない場合もありますよね?困った困った…🤔
そんな困った状況をいとも簡単に解決してくれるのが、このPGMフォーマットなんです。😄
それではもうちょっと詳しく紹介します。
PGMとは
- 詳細は以下のリンクに譲ります!😎
基本情報
- 少しは自分でも書きます😅
- PGMは、PNM形式の1つで8bitのグレースケール 画像のこと
- PGMとは、Portable GrayMap の略です
- 基本的にはRAW形式ですが、プレーンテキストのヘッダを持っている
- ヘッダには、以下の情報が書かれている
- 種別を示すマジックナンバー
- グレースケールのPGMは以下の2種類(他詳細は上記リンク参照)
- P2:ASCII形式
- P5:バイナリ形式
- 画像サイズ(幅と高さ)
- 輝度の最大値
- 種別を示すマジックナンバー
- 以下は、ASCII形式、640x480 画像のヘッダの例です
- ASCIIの場合ヘッダの次の行に輝度値、スペース、輝度値、…と書きます
P2 # シャープの後にコメントを書けます 640 480 255
保存のサンプルコード
- 以下に下記条件の画像保存のサンプルを載せておきます
- サイズ、640 x 480 画素
- 8bitグレースケール画像
- 画像データの配列を
unsigned char image[307200]
とします - 保存形式:バイナリー
- エラー処理などは割愛します
- 読み込みについては、上記参考サイトの2章にありますのでご参照下さい
{ // ファイルポインタ FILE *fp; // バイナリーモードで画像ファイルを開く fp = fopen("./sample.pgm", "wb" ); // 種別マジックナンバー fprintf(fp, "P5\n"); // 画像サイズ fprintf(fp, "640 480\n"); // 最大輝度 fprintf(fp, "255\n"); // 画像データの書き込み fwrite(image, sizeof(unsigned char), 640*480, fp); // クローズ fclose(fp); }
特徴
困ったこと
まとめ
- 以上、長々とPGMについて紹介してきましたがいかがでしたか?
- ここ読んで使ってみたいと思っていただけたら幸いです
- 今の現場ではDSPによる画像処理をやっていますが、製品環境でのデバッグとなると、ライブラリが使えなくて困ってたので…
- 少なくとも私の周辺ではかなり浸透しました
- 画処理おじさんとしては久しぶりに、画像処理的な話となりました
ではでは😎