【问题标题】:IndexOutOfBounds Exception HandlingIndexOutOfBounds 异常处理
【发布时间】:2015-03-26 01:30:40
【问题描述】:

我正在做一个任务,需要计算位置 (x,y) 周围像素的 NxN 平均值。

当我传入一个大小变量时,我正在尝试创建一个通用函数来执行此操作。

我只允许大小或 NxN 矩阵为 3x3、5x5 或 7x7。

我试图做的是为每个像素创建一个通用循环,检查它是否是极端情况,然后是侧面情况,如果不是,则为默认情况。

例子

0  1  2  3  4
5  6  7  8  9
10 11 12 13 14
15 16 17 18 19
20 21 22 23 24

如果我想做一个 5x5 的平均值,它需要这 25 个像素值来计算。但是如果我的 (x,y) 位置在 (1,2) 它将超出范围。

我试图找出每个场景的案例,但我发现解决起来很复杂,因为 5x5 出现了一些案例,而 3x3 不存在。 如果我的 (x,y) 在 (1,1) 它不属于我的角落案例,但它确实属于我的两个侧面案例(顶部和左侧)。

我想知道将所有内容都放入 try catch 语句中是否安全/值得,如果数组位置超出范围,没什么大不了的。

我根本不需要做任何案例,我可以检查 9 (3x3)、25 (5x5) 或 49 (7x7) 单独的数组位置是否超出范围。

前 3x3

try{
      imageBuffer.getRBG(x - 1, y -1);
 }catch{...}
try{
      imageBuffer.getRBG(x, y -1);
 }catch{...}
try{
      imageBuffer.getRBG(x + 1, y -1);
 }catch{...}

这看起来真的很糟糕,但我想找出这些情况来找出任何平均值的通用函数。

如果像素 (x,y) 周围的 NxN 平均值超出范围,它将计算范围内像素的平均值。如果它是 3x3 平均值并且它是第一个极端情况(左上角 (0,0)),我将计算我可以访问的 4 个像素。 所以

0 1 2
3 4 5
6 7 8

我会计算 4,5,7 和 8 的平均值

【问题讨论】:

  • 如果我理解正确,您只是想检查给定像素的相邻 8 个单元格。如果正确,这种情况类似于在 Minesweeper 游戏中寻找邻近的地雷。我的一位老师建议这种an approach。我希望它也会在这里有所帮助:-)
  • 出现拐角怎么办?计算其他像素的平均值?不认为它是结果图像的一部分?
  • 因此您只需遍历单元格 +/- N/2 内的 X 和 Y 值。如果每个单元格都存在,则将其值添加到您的总数中,并将 1 添加到您的计数中。如果没有,那么什么也不做。将总数除以最后的计数。究竟是什么问题?您不应该真正使用异常来处理具有边和角的正方形的“正常”情况。
  • 是的,我现在只是有点想,我只是把事情复杂化了。

标签: java indexoutofboundsexception


【解决方案1】:

不,如果没有必要,不要引发抛出异常。这是编码风格的问题。在这种情况下,解决方案实际上非常简单:

public int avg(int[][] matrix , int n , int x , int y){
     int sum = 0;

     //the number of pixels to go left and right from the center of
     //the nxn-matrix
     int nHelper = n / 2;

     //ensure the left upper corner of your matrix is in bounds
     int x_start = (x - nHelper < 0 ? 0 : x - nHelper);
     int y_start = (y - nHelper < 0 ? 0 : y - nHelper);

     //create sum of all elements in the nxn-matrix and in bounds of
     //the big matrix (assumption: the matrix is an array of columns
     int i , j;
     for(i = x_start ; i < x + nHelper + 1 && i < matrix.length ; i++)
          for(j = y_start ; j < y + nHelper + 1 && j < matrix[i].length ; j++)
                sum += matrix[i][j];

     //calculate the average
     return sum / ((i - x_start)  * (j - y_start));
}

这会计算以 x,y 为中心的 nxn 矩阵的平均值。将其转移到图像的使用中对您来说应该不会太难。如果您想计算矩阵中所有单元格的平均值,虽然另一种方法可能更有效。但它显示了基本思想。

【讨论】:

  • 这有几个小问题。 (1) 仅适用于方阵;而如果这是用于图像处理,则输入很可能是矩形。 (2) 你最后除以错误的东西。如果平均区域靠近边缘,则不应为n * n
猜你喜欢
  • 2020-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
  • 2014-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多