2016-05-14 163 views
0

我一直在嘗試在1維陣列上實現卷積算法,但需要將其表示爲2D NxM矩陣。試圖執行一個類似的方法後:圖像卷積和邊界

int kCenterX = kCol/2; 
int kCenterY = kRow/2; 

for(int i=0; i < mRow; ++i) {    // rows 
    for(int j=0; j < mCol; ++j) {   // columns 

     for(int m=0; m < kRow; ++m) {  // kernel rows 
      int mm = kRow - 1 - m;  // row index of flipped kernel 
      for(int n=0; n < kCol; ++n) { // kernel columns 
       int nn = kCol - 1 - n; // column index of flipped kernel 

       // 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 < mRow && jj >= 0 && jj < mCol) 
        o[i][j] += input[ii][jj] * kern[mm][n]; 
      } 
     } 
    } 
} 

來源:http://www.songho.ca/dsp/convolution/convolution.html#convolution_2d

而鑑於給出的兩個矩陣是:

input = {1,2,3,4,5,6,7,8,9,10,11,12,15,16}; 
// 1 2 3 4 
// 5 6 7 8 
// 9 10 11 12 
// 13 14 15 16 

sharpen_kernel = {0,-1,0,-1,5,-1,0,-1,0}; 
// 0 -1 0 
// -1 5 -1 
// 0 -1 0 

的問題是誰開發的編碼器就設置邊界外的所有值都是0.那麼,我可以使用什麼方法來檢查某個元素何時位於數組邊緣,然後推出這些值,以便使用內核值進行計算。基本上代表矩陣爲:

1 1 2 3 4 4 
1 *1 2 3 4* 4 
5 *5 6 7 8* 8 
9 *9 10 11 12* 12 
13 *13 14 15 16* 16 
13 13 14 15 16 16 
+0

另外我也困惑的線: 如果(ⅱ> = 0 &&二 = 0 && jj user3696819

回答

1

這裏是更新的代碼

int kCenterX = kCol/2; 
int kCenterY = kRow/2; 

for(int i=0; i < mRow; ++i) {    // rows 
    for(int j=0; j < mCol; ++j) {   // columns 

     for(int m=0; m < kRow; ++m) {  // kernel rows 
      int mm = kRow - 1 - m;  // row index of flipped kernel 
      for(int n=0; n < kCol; ++n) { // kernel columns 
       int nn = kCol - 1 - n; // column index of flipped kernel 

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

       if(ii < 0) 
        ii=ii+1; 
       if(jj < 0) 
        jj=jj+1; 
       if(ii >= mRow) 
        ii=ii-1; 
       if(jj >= mCol) 
        jj=jj-1;  
       if(ii >= 0 && ii < mRow && jj >= 0 && jj < mCol) 
        o[i][j] += input[ii][jj] * kern[mm][n]; 

      } 
     } 
    } 
}