Prewittのテンプレートマッチングによる輪郭抽出

Prewittの、テンプレートマッチングによる輪郭抽出を行う例です。
出力結果は、エッジの強度と方向で、方向は以下のように定義しています。


void previtt_template
( BYTE *btaIn, BYTE *btaOut, int nRow, int nCol )
{
    int nM[9], nN[8];
    int i, j, k, nMax, nData;
    
    for ( i = 0; i < nRow; i++ )
    {
        for ( j = 0; j < nCol; j++ )
        {
            nMax = 0;
            if ( i == 0 || i == nRow-1 || j == 0 || j == nCol-1 )
            {
                btaOut[i*nCol+j] = btaIn[i*nCol+j];
            }
            else
            {
                nM[0] = btaIn[(i-1)*nCol+(j-1)];
                nM[1] = btaIn[(i-1)*nCol+(j  )];
                nM[2] = btaIn[(i-1)*nCol+(j+1)];
                nM[3] = btaIn[(i  )*nCol+(j-1)];
                nM[4] = btaIn[(i  )*nCol+(j  )];
                nM[5] = btaIn[(i  )*nCol+(j+1)];
                nM[6] = btaIn[(i+1)*nCol+(j-1)];
                nM[7] = btaIn[(i+1)*nCol+(j  )];
                nM[8] = btaIn[(i+1)*nCol+(j+1)];
                
                nN[0] =  nM[0] + nM[1] + nM[2] + nM[3]
			 -2*nM[4] + nM[5] - nM[6] - nM[7] - nM[8];
                nN[1] =  nM[0] + nM[1] + nM[2] + nM[3]
                         -2*nM[4] - nM[5] + nM[6] - nM[7] - nM[8];
                nN[2] =  nM[0] + nM[1] - nM[2] + nM[3]
                         -2*nM[4] - nM[5] + nM[6] + nM[7] - nM[8];
                nN[3] =  nM[0] - nM[1] - nM[2] + nM[3]
                         -2*nM[4] - nM[5] + nM[6] + nM[7] + nM[8];
                nN[4] = -nM[0] - nM[1] - nM[2] + nM[3]
                         -2*nM[4] + nM[5] + nM[6] + nM[7] + nM[8];
                nN[5] = -nM[0] - nM[1] + nM[2] - nM[3]
                         -2*nM[4] + nM[5] + nM[6] + nM[7] + nM[8];
                nN[6] = -nM[0] + nM[1] + nM[2] - nM[3]
                         -2*nM[4] + nM[5] - nM[6] + nM[7] + nM[8];
                nN[7] =  nM[0] + nM[1] + nM[2] - nM[3]
                         -2*nM[4] + nM[5] - nM[6] - nM[7] + nM[8];
                
                for ( k = 0; k < 8; k++ )
                {
                    if ( nN[k] > nMax )
                    {
                        nMax = nN[k];
                    }
                }
                
                nData = nMax;
                if ( nData > 255 )
                {
                    nData = 255;
                }
                if ( nData < 0 )
                {
                    nData = 0;
                }
                
                btaOut[i*nCol+j] = (BYTE)nData;
            }
        }
    }
}

実行結果

入力画像結果画像
入力画像
結果画像

参考文献

アーカイブ