メディアンフィルタ

以下の例は、グレイスケールの画像に対して3×3のメディアンフィルタを適用するものです。
フィルタ領域でのソートは、とりあえずバブルソートを適用しています。

/*
グレイスケール画像に対する3×3 メディアンフィルタ
*/

void median_filter
( BYTE *btIn, BYTE *btOut, int nRow, int nCol )
{
    int i, j, k, l
    int naPix[9];
    BYTE btTemp;
    
    for ( i = 0; i < nRow; i++ )
    {
        for ( j = 0; j < nCol; j++ )
        {
            //隅の4辺は、そのままコピー
            if ( i == 0 || i == nRow-1 || j == 0 || j == nCol-1 )
            {
                btOut[i*nCol+j] = btIn[i*nCol+j];
            }
            else
            {
                naPix[0] = btIn[(i-1)*nCol+(j-1)];
                naPix[1] = btIn[(i-1)*nCol+(j  )];
                naPix[2] = btIn[(i-1)*nCol+(j+1)];
                naPix[3] = btIn[(i  )*nCol+(j-1)];
                naPix[4] = btIn[(i  )*nCol+(j  )];
                naPix[5] = btIn[(i  )*nCol+(j+1)];
                naPix[6] = btIn[(i+1)*nCol+(j-1)];
                naPix[7] = btIn[(i+1)*nCol+(j  )];
                naPix[8] = btIn[(i+1)*nCol+(j+1)];
                
                //バブルソート
                for ( k = 0; k < 8; k++ )
                {
                    for ( l = k; l < 9; l++ )
                    {
                        if ( naPix[k] > naPix[l] )
                        {
                            btTemp = naPix[k];
                            naPix[k] = naPix[l];
                            naPix[l] = btTemp;
                        }
                    }
                }
                btOut[i*nCol+j] = naPix[4];
            }
        }
    }
}

参考文献

アーカイブ