Normalized Cross Correlation(NCC)는 영상과 모델의 밝기의 선형적인 차이와 독립적으로 영상과 model간의 기하학적인 유사도를 측정하는 방법이다. correlation값은 다음과 같은 경우에도 불변하다.
1. 영상/모델의 모든 화소밝기가 어떤 상수만큼 곱해진 경우
2. 영상/모델의 모든 화소밝기에 어떤 상수값이 더해진 경우
이와 같은 선형적인 밝기 변화에 대한 correlation 값의 독립성의 NCC의 가장 중요한 성질 중의 하나이다.
//아래 코드
/- process normalized cross correlation *-
doubleiNCC(image_ptr buf, const int *rows, const int *cols, image_ptr temp, const int *tRows, const int *tCols, int *retX, int *retY)
{
int i, j, u, v;
double meanBuf = 0.0, meanTemp = 0.0;
double numer = 0.0;
double denom = 0.0;
double meanSub = 0.0;
double NCC = 0.0;
double maxNCC = 0.0;
double numTempPixel = (*tRows)*(*tCols);
for(u = 0; u < *tRows; ++u)
for(v = 0; v < *tCols; ++v)
meanTemp += ((double)*(temp + u*(*tCols) + v))/numTempPixel;
for(u = 0; u < *tRows; ++u)
for(v = 0; v < *tCols; ++v)
meanSub += (((double)*(temp + u*(*tCols) + v)) - meanTemp)*(((double)*(temp + u*(*tCols) + v)) - meanTemp);
for(i = 0; i < (*rows - *tRows); ++i)
{
for(j = 0; j < (*cols - *tCols); ++j)
{
// get mean of the image which is underneath the template
meanBuf = 0.0;
for(u = 0; u < *tRows; ++u)
for(v = 0; v < *tCols; ++v)
meanBuf += ((double)*(buf + (i+u)*(*cols) + (j+v)))/numTempPixel;
// get correlation
NCC = 0.0;
numer = 0.0;
denom = 0.0;
for(u = 0; u < *tRows; ++u)
{
for(v = 0; v < *tCols; ++v)
{
numer += (((double)*(buf + (i+u)*(*cols) + (j+v))) - meanBuf)*(((double)*(temp + u*(*tCols) + v)) - meanTemp);
denom += (((double)*(buf + (i+u)*(*cols) + (j+v))) - meanBuf)*(((double)*(buf + (i+u)*(*cols) + (j+v))) - meanBuf);
}
}
NCC = numer/sqrt(denom*meanSub);
if(maxNCC < NCC)
{
maxNCC = NCC;
*retX = j;
*retY = i;
}
}
}
return maxNCC;
}
//평균과 분산은 opencv에서는 좀더 빠르게 구할 수 있다. 마찬가지 픽셀합과 픽셀 제곱 합도 opencv함수를 이용하면 빠르게 구할 수 있다.