前回コメントくださった方ありがとうございます。  
ご指摘いただきました場所を修正したところ強制終了は回避できるようになりました。  
しかしプログラムは上手く座標を渡してくれませんでした。  
コメントを参考にプログラムを書き直したところはコメントアウトして新しいものを載せておきます。

**入力画像1**  
[![入力画像1](https://i.stack.imgur.com/3tuNA.png)](https://i.stack.imgur.com/3tuNA.png)

**入力画像2**  
[![入力画像2](https://i.stack.imgur.com/wjTVe.png)](https://i.stack.imgur.com/wjTVe.png)

上の画像を入力したところ返ってきたマッチングの始点となる座標は (y,x) = (45,204) でした。  
（画像1の画素は225×225であり明らかに目的とする画素より遠い）  
プログラムの数式が間違っているのかそもそもアルゴリズムの使い方が間違っているのかわかりません。

### 前提・実現したいこと

C言語とGCCを使っています。  
ZNCC（テンプレートマッチング）を使い類似度の一番高い一番最初の画素の特定を輝度情報をもとに実装したいのですが、コンパイルは通るものの探索がある一定の位置でプログラムが強制終了してしまいます。//強制終了は解決しました！ありがとうございます！

画像のピクセルの位置は一次元の配列になっています。  
imgは元の大きい画像をtempはテンプレート画像を表しています。  
NCC関数内で元画像の（x,y）を起点とする類似度を求め、templatematching関数で類似度が一番高かった座標を求めています。

私はプログラミング初心者でつたないコードしか書けませんがよろしくお願いいたします。

### 該当のソースコード

```

    typedef struct{
      unsigned int width;
      unsigned int height;
      Rgb *rgb;
      Hsv *hsv;
    }Image;
    
    int templatematching(Image *img, Image *temp)
    {
      int i, j, k, x, y, index;
      double ncc=-1.0, n, mu=0;
    
      for(k=0; k<temp->height*temp->width; k++){
        mu += temp->hsv[k].v;
      }
      mu = mu / k;
    
      for(i=0; i<img->height; i++){
        for(j=0; j<img->width; j++){
    
          if(ncc < (n = NCC(img, temp, j, i, mu)))
          {
            ncc = n;
            y = i;
            x = j;
         }
        }
      }
    
      index = y*img->width + x;
      return index;
    
    }
    
    double NCC(Image *img, Image *temp, int x, int y, double mu)
    {
      int i, j, k=0, index;
      double bunsi=0, bunbo1=0, bunbo2=0;
      double ncc, mi=0;
    
      if(img->width - x < temp->width / 3 || img->height - y < temp->height / 3) {return -2.0;}//この方がマッチングがうまくいくのかと思い書き加えました
    
      index = y * img->width + x;
    
      for(i=0; i<temp->height-1; i++){
        for(j=0; j<temp->width-1; j++){
          if(((y + (i * img->width)) > img->height) || (x + j > img->width) ) break;
          mi += (img->hsv[index + i * img->width + j].v);
          k++;
        }
      }
    
      mi = mi / k;
    
        for(i=0; i<temp->height-1; i++){
            for(j=0; j<temp->width-1; j++){
    //        if((y + i * img->width > img->height) || (x + j > img->width) ) break;
            if((y + i) > img->height || (x + j > img->width) ) break;
            bunsi += (img->hsv[index + i * img->width + j].v-mi) * (temp->hsv[i*temp->width+j].v-mu);
    //       bunbo1 += sqrt((img->hsv[index + i * img->width + j].v -mi)* (img->hsv[index + i * img->width + j].v -mi));
    //       bunbo2 += sqrt((temp->hsv[i*temp->width+j].v- mu) * (temp->hsv[i*temp->width+j].v- mu));
              bunbo1 += fabs(img->hsv[index + i * img->width + j].v - mi);
              bunbo2 += fabs(temp->hsv[index + i * temp->width + j].v - mu);
    
            }
        }
    
        if(bunbo1 == 0 || bunbo2 == 0 ) return -2.0;　//念のため分母が０のときは―2を返す
    
        ncc = bunsi / (bunbo1 * bunbo2);
    
        return ncc;
    }
    
```
CC BY-SA 4.0
2020-02-04T14:42:51.730
62776
2020-02-05T00:20:35.850
2020-02-05T00:20:35.850
3060
37713
question
c
画像処理のZNCCの返り値の座標が明らかにおかしい