投稿者 tel | 2010年12月1日

画像処理プログラミング – 幾何学変換(水平、垂直反転)

もう12月です。
水平反転とか垂直反転。たぶんアフィン変換に含まれるけど単体でやったほうが速いんじゃないかな。

カメラからの入力画像を反転するとかの用途で使えるかもしれない。でもUSBカメラだとドライバで反転オプションがついているかもしれない。

/*
 * 水平方向反転
 */
template <typename T>
void FlipHorz(const Image<T> *src, Image<T> *dst)
{
    int w = src->width;
    int h = src->height;

    dst->Create(w, h);

    for(int i = 0; i < h; i++) {
        for(int j = 0; j < w / 2; j++) {
            dst->lines[i][j] = src->lines[i][w - j - 1];
            dst->lines[i][w - j - 1] = src->lines[i][j];
        }
    }
}

/*
 * 垂直方向反転
 */
template <typename T>
void FlipVert(const Image<T> *src, Image<T> *dst)
{
    int w = src->width;
    int h = src->height;

    dst->Create(w, h);

    for(int i = 0; i < h; i++) {
        for(int j = 0; j < w; j++) {
            dst->lines[i][j] = src->lines[h - i - 1][j];
        }
    }
}

実装としては特に難しいことはない。反転された位置の画素をとってきて出力画像に設定しているだけ。ただし上記のコードだと入力と出力が同じ場合にうまくいかない。

入力画像

水平反転した出力画像

垂直反転した出力画像

やっと画像クラスをテンプレートにした利点が出てきたような気がする。画像処理だと計算量を減らすためにグレイスケール化して処理する場合が多いので8bitの処理と24bitの処理が一気に書けるといい感じ。

毎回同じような幅の取得とか、画像の生成とかループとかを書いているのがちょっといやな感じ。うまいやり方はないものか。


コメントを残す

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

WordPress.com ロゴ

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

Twitter 画像

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

Facebook の写真

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

Google+ フォト

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

%s と連携中

カテゴリー

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