画像の相関係数を求める

大きさが同じ2つの画像の相関係数は以下の式で求められます。

//_//_//_//_//_//_//_//_//_//_//_//_//_//_//_//_//_//_//_//_//_//_//_/
//
//    Correlation        :    部分画像とテンプレートの相関係数を求める
//                        部分画像とテンプレートのサイズは同じ
//    
//_//_//_//_//_//_//_//_//_//_//_//_//_//_//_//_//_//_//_//_//_//_//_/
double correlation
(
    BYTE    *btaImg,
    BYTE    *btaTmp,
    int        nRow,
    int        nCol
)
{
    double        dCorrelation;
    double        dAveImg, dAveTmp;
    double        dXT, dYT, dSXX, dSXY, dSYY;
    int            i, j;

    dAveImg = 0.0; dAveTmp = 0.0;

    //平均値を求める
    for ( i = 0; i < nRow; i++ )
    {
        for ( j = 0; j < nCol; j++ )
        {
            dAveImg += btaImg[i*nCol+j];
            dAveTmp += btaTmp[i*nCol+j];
        }
    }
    dAveImg /= nRow * nCol;
    dAveTmp /= nRow * nCol;

    //相関係数を求める
    dSXX = 0.0; dSYY = 0.0; dSXY = 0.0;
    for ( i = 0; i < nRow; i++ )
    {
        for ( j = 0; j < nCol; j++ )
        {
            dXT = btaImg[i*nCol+j] - dAveImg;
            dYT = btaTmp[i*nCol+j] - dAveTmp;
            dSXX += dXT * dXT;
            dSYY += dYT * dYT;
            dSXY += dXT * dYT;
        }
    }

    dCorrelation = dSXY / sqrt( dSXX * dSYY );

    return dCorrelation;
}

テンプレートマッチングに使う

上記の計算はもっぱらテンプレートマッチングで使用されます。
テンプレートマッチングは、対象画像をスキャンして順に部分画像を切り出し、
部分画像とテンプレート画像の相関係数を上記の計算を用いて計算し、
相関係数が高い部分画像をマッチング位置とする方法です。

相関係数を使用する利点は、
テンプレート画像に対する対象画像の全体的な明度の差に影響されにくいという点です。
例えば以下のような操作をして実験をした場合でもマッチング位置を正しく抽出することができます。

  1. 対象画像からテンプレートとして部分画像を切り出す
  2. 切り出したテンプレートの明度をあげる(または下げる)
  3. テンプレートマッチングを実行する


実行結果

テンプレートマッチング実行結果

しかし、計算量が多いので、走査範囲をなるべく減らす工夫がされることが多いです。
特にステレオマッチングでは

  • エピポーラ拘束条件を使用する
  • 被写体までの概略距離を事前に入力する

などの工夫で走査範囲を限定します。

テンプレートマッチングに使用されるのは相関係数のほかに、
差の絶対値を用いるSAD、差の2乗和を用いるSSDがあります。
これらは計算量が少なく、また残差逐次計算によって計算を途中で打ち切ることができるなどの利点がありますが、
上記のように明度差がある場合ではマッチングに失敗する場合があります。

参考文献

アーカイブ