投稿者 tel | 2010年10月13日

画像処理プログラミング – メディアンフィルタ

ひさしぶりにブログを書いた。あんまり書くネタもないけどメディアンフィルを作ってあったので載せておく。

メディアンフィルタは平滑化処理の一種、入力画像のノイズを除去するときとかに使う。でも動画に対してリアルタイムでかけると処理コストが高いから使わない気がする。

template <int N, typename T>
inline T GetMedian(T table[])
{
    T min;
    int index;
    for(int i = 0; i < N / 2; i++) {
        min = table[i];
        index = i;
        for(int j = i; j < N; j++) {
            if(min > table[j]) {
                index = j;
                min = table[j];
            }
        }
        T tmp = table[i];
        table[i] = table[index];
        table[index] = tmp;
    }
    return table[N / 2 - 1];
}

/*
 * Median Filter
 */
template <typename T>
void Median(const Image *src, Image *dst)
{
    int w = src->width;
    int h = src->height;
    dst->Create(w, h);
    T table[9];
    for(int j = 0; j < w; j++) {
        dst->lines[0][j] = src->lines[0][j];
    }
    for(int i = 1; i < h - 1; i++) {
        dst->lines[i][0] = src->lines[i][0];
        for(int j = 1; j < w - 1; j++) {
            table[0] = src->lines[i - 1][j - 1];
            table[1] = src->lines[i - 1][j];
            table[2] = src->lines[i - 1][j + 1];
            table[3] = src->lines[i][j - 1];
            table[4] = src->lines[i][j];
            table[5] = src->lines[i][j + 1];
            table[6] = src->lines[i + 1][j - 1];
            table[7] = src->lines[i + 1][j];
            table[8] = src->lines[i + 1][j + 1];

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

とくに何も考えてない無難な実装。中央値を求めるためにソートをする必要があるけど、選択ソートを使って中央値が分かった時点で残りをソートしないようにしている。いちいち配列にいれたり、中央値を求めたりするのがもっと効率的な方法があるような気がする。

入力画像

この画像だと変化がわかりづらい。

出力画像

ちょっとぼけた感じなったかな。320×240のサイズで処理速度は0.039467秒。

 


コメントを残す

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

WordPress.com ロゴ

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

Twitter 画像

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

Facebook の写真

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

Google+ フォト

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

%s と連携中

カテゴリー

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