0

林與卷積操作(特徵地圖)的工作和我有此問題:麻煩與矩陣乘法(JAVA)

當我輸入的代碼完全運行,並且輸出所述圖像變換(一切確定與正方形圖像即)

這是代碼:

long ImageMatrix[][] = new long[width][height]; 
    int CounterColumns = 0; 

BufferedImage KernelImg = new BufferedImage(width-2,height-2,BufferedImage.TYPE_INT_ARGB); 

    try { 
     for (j = 0; j < height-2; j++) { 
      for (k = 0; k < width-2; k++) { 
       for (w = 0; w < 3; w++) { 
        for (v = 0; v < 3; v++) { 
         int Sj = j + w; 
         int Sv = v + CounterColumns; 
         sum += ImageMatrix[Sj][Sv] * Kernel[w][v]; 
        } 
       } 

       int a = 255; 
       int p = (a << 24) | (sum << 16) | (sum << 8) | sum; 
       sum = 0; 
       CounterColumns++; 
       count++; 
       KernelImg.setRGB(j, k, p); 
      } 
      CounterColumns = 0; 

     } 
    } 
    catch(Exception e){ 
     System.out.println(e); 
    } 

上面的代碼相乘內核矩陣(3×3矩陣)和圖像矩陣的循環,這是內核矩陣的一個示例:

int Kernel[][] = { 

      {-1,-1,-1}, 
      {-1,8,-1}, 
      {-1,-1,-1} 

    }; 

的問題是,當我輸入的矩形圖像的系統停止工作,並把我這個錯誤:

java.lang.ArrayIndexOutOfBoundsException:165

我已經搜索這個錯誤,但我沒有找到解決問題的任何東西,我不知道爲什麼代碼與正方形圖像運行沒有問題,但如果我輸入一個矩形的錯誤顯示。

謝謝,如果你能幫助我這個。

+0

你有沒有試過通過調試器運行這個? – KyleKW

回答

0

你的代碼是不對稱的:你處理列的方式不同於行;他們都應該儘可能走指標同等對待:

try { 
    for (j = 0; j < width-2; j++) { 
     for (k = 0; k < height-2; k++) { 
      for (w = 0; w < 3; w++) { 
       for (v = 0; v < 3; v++) { 
        int Sj = j + w; 
        int Sv = k+v; 
        sum += ImageMatrix[Sj][Sv] * Kernel[w][v]; 
       } 
      } 


    } 

您還必須正確使用索引:J-範圍在0..width-2和K 0..height-2

+0

已經嘗試過,並扔我同樣的錯誤@gpasch –

+0

顯示錯誤來自的行 – gpasch

+0

** sum + = ImageMatrix [Sj] [Sv] * Kernel [W] [V]; **在這一行 –

0

您必須在您處理的像素上以內核爲中心。下面是灰度級圖像的基本示例:

BufferedImage source = // A TYPE_BYTE_GRAY image 
BufferedImage result = new BufferedImage(source.getWidth(), source.getHeight(), BufferedImage.TYPE_BYTE_GRAY) ; 

try { 
    for (int y=1 ; y < height-1 ; y++) 
     for (int x=0 ; x < width-1; x++) 
      { 
      int sum = 0 ; 
      for (int i=-1 ; i <= 1 ; i++) 
       for (int j=-1 ; j <= 1 ; j++) 
        sum += source.getRaster().getSample(x, y, 0) * Kernel[i+1][j+1] ; 
      result.getRaster().setSample(x, y, 0, sum) ; 
      } 
    } 
catch (Exception e) 
    { 
    e.printStackTrace() ; 
    } 

在梯度的情況下,在邊界操作沒有很好地定義(不同的解決方案,但是沒有是一個很好的),所以在本例中最終與零。