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

当我传入一个size变量时,我试图做一个通用的函数来做到这一点。

我只允许大小或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的平均值

最佳答案

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

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矩阵的平均值。对您而言,将其转换为图像使用应该不会太困难。尽管使用其他方法可能更有效,但是如果要计算矩阵中所有单元的平均值。但这显示了基本思想。

关于java - IndexOutOfBounds异常处理,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29269586/

10-13 03:25