画処理おじさんの徒然日記

画処理おじさんの徒然日記

画像処理や一眼レフカメラに関して書きます。試したことの備忘録的に。

みんな大好きPGM

こんばんは。今宵も絶賛残業中だった画処理おじさんです。😅

突然ですが、組込みソフト開発現場の皆さん!画像ログを残す時、どんなフォーマットをご使用してますでしょうか?私がお勧めしているのは、PGMというフォーマットです。

かゆいところに手が届く、いいやつなんです!かれこれ20年来の付き合いです。

まえがき

弊社ではデバッグ中の画像保存する場合、一般的にはRAWを使っています。しかし、このRAWですが、保存する時のC/C++のコードはすこぶる単純ですが、画像ビューワで開く時、いちいちサイズだの深さだの入力するのが面倒なんですよね。かと言って、PNGやJPG等の一般的なフォーマットでの保存となると、OpenCVなどのライブラリが必要になってきます。けれども環境によってはライブラリが使えない場合もありますよね?困った困った…🤔

そんな困った状況をいとも簡単に解決してくれるのが、このPGMフォーマットなんです。😄

それではもうちょっと詳しく紹介します。

PGMとは

  • 詳細は以下のリンクに譲ります!😎

www.mm2d.net

基本情報

  • 少しは自分でも書きます😅
  • 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);
}

特徴

  • ソースコードが簡単
  • 保存時にライブラリ不要
  • 画像ビューワで開く時に、サイズと深さ情報などの入力が不要
  • imagej, irfanview 等の一般的な? ビューワにも対応

困ったこと

  • パワポに直接貼り付けられません!
  • 上記のImageJやirfanviewなどで一括変換も出来ますが、意外と厄介だったので、自分は簡易変換ソフト作っちゃいました(需要があれば公開します)

まとめ

  • 以上、長々とPGMについて紹介してきましたがいかがでしたか?
  • ここ読んで使ってみたいと思っていただけたら幸いです
  • 今の現場ではDSPによる画像処理をやっていますが、製品環境でのデバッグとなると、ライブラリが使えなくて困ってたので…
  • 少なくとも私の周辺ではかなり浸透しました
  • 画処理おじさんとしては久しぶりに、画像処理的な話となりました

ではでは😎