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; } } } }
実行結果
入力画像 | 結果画像 |