投稿者 tel | 2010年9月5日

画像処理プログラミング – ネガポジ変換

画像処理の基礎の基礎として、各画素にアクセスして画像になんらかの処理をしてみる。サンプルとしてネガポジ変換をする。ネガポジ変換は、いわゆるフィルムのネガの状態で、単純に各画素の階調が反転しただけ。つまり階調の最大値(通常は255)から画素値を引く。以下コード。

template <typename T>
void Nega(const Image<T> *src, Image<T> *dst)
{
  dst->Create(src->width, src->height);
  for(int i = 0; i height; i++) {
    for(int j = 0; j width; j++) {
      dst->lines[i][j].r = 255 - src->lines[i][j].r;
      dst->lines[i][j].g = 255 - src->lines[i][j].g;
      dst->lines[i][j].b = 255 - src->lines[i][j].b;
    }
  }
}

srcが入力画像で、dstが出力画像を指定している。最初に出力画像のバッファを確保する。一応、画像処理の基礎なので処理速度を犠牲にしてわかりやすいロジックにしてある。ポイントとしては画像の各画素にアクセスするために二重ループにする、二重ループにしたときに内側を幅、外側を高さのループにする。
Bitmapの読み込みと書き込みをあわせて、呼び出しているコードは

#include <stdio.h>
#include "timer.h"
#include "bmp.h"
#include "ip.h"

int main(int argc, char *argv[])
{
  if(argc > 1) {
    Image<RGB> image, image2;

    Timer timer;

    printf("start : load bitmap\n");

    timer.Start();
    LoadBitmap(argv[1], &image);
    printf("time : %f\n", timer.Stop());

    printf("start : Nega\n");
    IP::Nega(&image, &image2);
    printf("time : %f\n", timer.Stop());

    printf("start : save bitmap\n");
    timer.Start();
    SaveBitmap("out.bmp", &image2);
    printf("time : %f\n", timer.Stop());
  }
  return 0;
}

Nega関数はip.hのヘッダにnamespaceをつけて実装してあります。実行した結果は上が入力画像、下が出力画像。

ネガは画像処理プログラミングのイロハを説明するにはあんまり向いてないような気がしてきた。


コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

カテゴリー

%d人のブロガーが「いいね」をつけました。