boost::gil。Adobe社の作った画像処理ライブラリです。
環境を準備するのがけっこう大変でした。せめてJpegだけでも入出力できれば、、、と四苦八苦。VCを使っている人は下のサイトを参考にすればかなり近道になります。
libjpegの使い方(Visual Studio 2008)(MASATOさんに感謝)
まず、libjpegmd.lib、libjpegmdd.lib、libjpegmt.lib、libjpegmtd.libを生成。後でVC側でランタイムライブラリの指定を行います。(2008ではシングルスレッド用のは廃止)libjpegmdとlibjpegmddはDLL対応のライブラリ。DLL対応でコンパイルするとライブラリが実行ファイルに静的リンクされないので、ファイルサイズが小さくなります。ただし、実行ファイルのみを他の環境に持って行く場合にランタイムDLLが存在していないともちろん実行できません。VC側の設定ですが、プロジェクトのプロパティ->構成プロパティ->C/C++->コード生成->ランタイムライブラリで行います。ここで指定通りのランタイムライブラリをリンカに追加します。例えば、マルチスレッド デバッグ (/MTd)なら、libjpegmtd.libを追加します。これをちゃんと合わせて指定してやらないと、コンパイル時に大量の警告やエラーが出てしまいます。Let’s Boostのサンプルがちょっとアレだったので、本家のGeneric Image Library Tutorialを見ながらまずは一次微分画像を出力するところまでがんばって進めます。
下のコードは画像のX軸方向に対する一次微分の処理です。
1 2 3 4 5 6 7 8 9 |
void x_gradient(const gray8c_view_t& src, const gray8s_view_t& dst) { for (int y=0; y<src.height(); ++y) { gray8c_view_t::x_iterator src_it = src.row_begin(y); gray8s_view_t::x_iterator dst_it = dst.row_begin(y); for (int x=1; x<src.width()-1; ++x) dst_it[x] = (src_it[x-1] - src_it[x+1]) / 2; } } |
gray8c_view_tは8bitグレースケール画像を扱います。GILではビット深度や色空間などそれぞれの型があって、例えばrgb32f_view_tなら32bit浮動小数点型RGBカラー画像になります。わかりやすいですがちょっと名前とか長ったらしいですね。ここでviewというのは画像そのもの(image)ではなくて、画像にアクセスするためのアダプタになります。次にコード中のrow_begin(y)というのは、各行(y座標)の先頭で初期化されたイテレータです。これをポインタのように(というかポインタとして)扱って画素を走査していきます。dst_it[x] = (src_it[x-1] – src_it[x+1]) / 2; は、x軸方向において注目画素(x)の隣接画素の差分平均を取っています。ここを2で割らなければ単純差分になります。これは8ビットグレースケール画像のみに適用できる汎用性のないコードなので、これをどんな型のimageでも扱えるようにするにはtempleteを使う必要があります。GILを使いこなすにはどうやらtempleteの知識が必須のようです。
jpegでの読み込み・書き出しは、
1 2 3 4 5 6 |
// 読み込み rgb8_image_t src; jpeg_read_image("lena.jpg", src); // 書き出し jpeg_write_view("result.jpg", view(dst)); |
でOK。ここは簡単ですね。pngの場合は png_read_image() とかに変わります。
今回はこれくらいで。templeteは難しい。