2017-01-03 6 views
2

저는 C 언어로 행렬의 컨볼 루션을 시도하고 있습니다.C - 2D Convolution

나는 뭔가를 시도했지만 제대로 할 수 없습니다.

N[WIDTH1][WIDTH2]은 입력 행렬이고, M[MASK_WIDTH1][MASK_WIDTH2]은 커널 행렬이고 P[][] 출력 행렬입니다.

첫 번째 시도 :

void convolution_2D(int N[][WIDTH2], int M[][MASK_WIDTH2], int P[][WIDTH2]) { 

// find center position of kernel (half of kernel size) 
int kCenterX = MASK_WIDTH2/2; 
int kCenterY = MASK_WIDTH1/2; 

for (int i = 0; i < WIDTH1; ++i)    // rows 
{ 
    for (int j = 0; j < WIDTH2; ++j)   // columns 
    { 
     for (int m = 0; m < MASK_WIDTH1; ++m)  // kernel rows 
     { 
      int mm = MASK_WIDTH1 - 1 - m;  // row index 

      for (int n = 0; n < MASK_WIDTH2; ++n) // kernel columns 
      { 
       int nn = MASK_WIDTH2 - 1 - n; // column index 

       // index of input signal, used for checking boundary 
       int ii = i + (m - kCenterY); 
       int jj = j + (n - kCenterX); 

       // ignore input samples which are out of bound 
       if (ii >= 0 && ii < WIDTH1 && jj >= 0 && jj < WIDTH2) 
        P[i][j] += N[ii][jj] * M[mm][nn]; 
      } 
     } 
    } 
} 

문제는 내가 M 행렬의 잘못된 값을 선택하기 때문에 경계 값이 잘못된 것입니다. 예를 들어, P[0][0] 대한 결과와 NP 및 5 × 3 × M 들어 같아야

P[0][0] = N[0][0]*M[1][1] + N[0][1]*M[1][2] + N[1][0]*M[2][1] + N[1][1]*M[2][2]; 

I 하부 오른쪽 부분 필요한 커널의 값; 그 코드는 왼쪽 상단 부분을 선택하고 올바른 값을 검사하는 코드를 작성할 수 없습니다.

+0

이 코드는 함수가 호출 될 때 P의 모든 값이 0으로 초기화하는 것으로 가정합니다. – samgak

+1

mm 및 nn의 요점은 무엇입니까? 방금 m과 n을 사용하면 작동 할 것 같습니다. – samgak

+0

예, P는 0으로 초기화됩니다. 나는 바보 같지만 .... 나는 그것이 효과가 있다고 생각한다. 출력 값을 확인하고 질문을 닫을 것입니다. 고맙습니다! 편집 : 작동합니다! – Pleasant94

답변

1

필요한 커널 값은 오른쪽 하단 부분입니다. 그 코드는 왼쪽 상단 부분을 선택하고 올바른 값을 검사하는 코드를 작성할 수 없습니다. 당신이 mmnn을 계산 할 때 마스크 인덱스를 뒤집기 때문에

입니다. 간단히 그 라인을 제거하고 인덱스에 마스크 mn를 사용

if (ii >= 0 && ii < WIDTH1 && jj >= 0 && jj < WIDTH2) 
    P[i][j] += N[ii][jj] * M[m][n];