2014-12-07 2 views
0

현재 공간 자동 상관 알고리즘을 사용하여 이미지의 패턴을 분석하는 프로그램에서 작업 중입니다. 0에서 2 사이의 값을 반환해야합니다. 코드를 실행할 때 0 값을 얻지 만 나머지는 수십억에 이릅니다 (음수와 양수 모두). 나는 내 수학과 어딘가에 잘못 갔다고 생각하지만, 나는 그것을 알아낼 수 없었다. 아래는 내가 사용하고있는 알고리즘 (Geary 's C, Geary 's Coefficient)과 내가 작업 해 온 코드에 대한 링크입니다.Geary 's Coefficient 알고리즘에 대한 잘못된 결과 얻기 (잘못된 수학?)

http://faculty.salisbury.edu/~ajlembo/419/lecture15.pdf

 /* 
     CREATING WEIGHT MATRIX (QUEEN'S CASE) 
    */ 

    int wSize = 3; 
    int wHalf = (wSize - 1)/2; 
    double weight[3][3] = {{1,1,1},{1,1,1},{1,1,1}}; 

cout << "test2" << endl; 
    /* 
     APPLYING WEIGHT SUM FOR (NAME OF FUNCTION) 
    */ 
    unsigned char* c = new unsigned char[pixels*3]; 

cout << "test3" << endl; 
    for (int j = 0; j < columns; j++) { 
     for (int i = 0; i < lines; i++) { 
      int index = (i * lines + j) * 3; 
      double sum1R = 0, sum1G = 0, sum1B = 0; 
      double sum2R = 0, sum2G = 0, sum2B = 0; 
      double weightsum = 9; 
      for (int l = 0; l < wSize; l++) { 
       for (int k = 0; k < wSize; k++) { 
        int tempk = (k+j) - wHalf; 
        int templ = (l+i) - wHalf; 
        // making sure we are not out of bounds of the image 
        if((tempk > (columns - 1)) || (tempk < 0)){ 
         tempk = j; 
        } 
        if((templ > (lines - 1)) || (templ < 0)){ 
         templ = i; 
        } 
        int pos1 = (tempk*lines + 0) * 3; 
        int pos2 = (0 + templ) * 3; 
        int r1 = originalpixmap[pos1], g1 = originalpixmap[pos1+1], b1 = originalpixmap[pos1+2]; 
        int r2 = originalpixmap[pos2], g2 = originalpixmap[pos2+1], b2 = originalpixmap[pos2+2]; 
        sum1R += (weight[tempk][templ])*pow((r1-r2),2); 
        sum1G += (weight[tempk][templ])*pow((g1-g2),2); 
        sum1B += (weight[tempk][templ])*pow((b1-b2),2); 
       } 
      } 

      double meanSumR = 0, meanSumG = 0, meanSumB = 0; 
      for(int l = 0; l < wSize; l++){ 
       int templ = (l+i) - wHalf; 
       int pos = (0 + templ) * 3; 
       if((templ > (lines - 1)) || (templ < 0)){ 
        templ = i; 
       } 
       int r = originalpixmap[pos], g = originalpixmap[pos+1], b = originalpixmap[pos+2]; 

       meanSumR += r; 
       meanSumG += g; 
       meanSumB += b; 
      } 

      double meanR = meanSumR/wSize; 
      double meanG = meanSumG/wSize; 
      double meanB = meanSumB/wSize; 
      for(int l = 0; l < wSize; l++){ 
       int templ = (l+i) - wHalf; 
       int pos = (0 + templ) * 3; 
       if((templ > (lines - 1)) || (templ < 0)){ 
        templ = i; 
       } 
       int r = originalpixmap[pos], g = originalpixmap[pos+1], b = originalpixmap[pos+2]; 

       sum2R += pow((r-meanR),2); 
       sum2G += pow((g-meanG),2); 
       sum2B += pow((b-meanB),2); 
      } 

      double rval = ((pixels-1)/2)*((sum1R)/(weightsum*sum2R)); 
      double gval = ((pixels-1)/2)*((sum1G)/(weightsum*sum2G)); 
      double bval = ((pixels-1)/2)*((sum1B)/(weightsum*sum2B)); 
      c[index] = (int)rval; 
      c[index+1] = (int)gval; 
      c[index+2] = (int)bval; 
      cout<< "C.r: " << rval <<" C.g: "<< gval <<" C.b: " << bval << endl; 
     } 
    } 

} 
+0

디버거 사용에는 어떤 것이 있습니까? 이것이 잘못된 곳을 찾는 방법입니다 - 디버거를 사용하십시오. – PaulMcKenzie

+0

저는 실제로 디버거를 사용하는 방법을 정확히 알지 못합니다.이 클래스보다 먼저 코딩 경험을 한 적이 없었습니다. 코드를 컴파일 할 때 오류가 없었지만 반환 된 값은 있어야하는 것이 아닙니다. –

+0

어떤 컴파일러를 사용하고 있습니까? Visual Studio라면 디버거는'Debug' 메뉴를 사용하는 것만큼이나 쉽습니다. gcc이면 gdb가 디버거입니다. 요점은 무역 도구에 익숙하지 않으면 장난감 프로그램 이외에 아무것도 쓸 수 없다는 것입니다. – PaulMcKenzie

답변

0

귀하의 가중치는 double 유형하지만 당신은 sum1Rint 유형입니다. 어쩌면 sum1R 등 변수도 double이어야합니까?

+0

분명히 몇 가지 변화가 있었지만, 여전히 많은 '0'사이에 '9.17528e + 272'및 일부 무한대 값을 얻고 있습니다. 위 코드를 새로 작성하겠습니다. –

+1

중간 값을 출력하여 해당 루프의 반복마다 무엇이 있는지 알아야합니다. 또는 데이터가 포함 된 작은 예제를 제공하십시오. – PaulMcKenzie