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() ; 
    } 

在梯度的情况下,在边界操作没有很好地定义(不同的解决方案,但是没有是一个很好的),所以在本例中最终与零。