IndexOutOfBounds Обработка исключений

1

Im выполняет задание, которое должно вычислять среднее значение NxN пикселей вокруг позиции (x, y).

Я пытаюсь сделать одну общую функцию, которая сделает это, когда я передам переменную размера.

Im, позволяя размеру или матрице 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, и если позиция массива вне пределов, никакой biggie.

Я вообще не должен был делать какие-либо случаи, и я мог бы просто проверить отдельные позиции массива 9 (3x3), 25 (5x5) или 49 (7x7), если они находятся за пределами границ.

Ex для 3x3

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

Это кажется очень плохим, но я теряю рассудок, пытаясь выяснить эти случаи для одной общей функции для любого среднего.

Если среднее значение NxN вокруг пикселя (x, y) выходит за пределы, оно будет вычислять среднее значение пикселей в границах. Если бы это было среднее значение 3x3 и первый квадратный регистр (верхний левый в (0,0)), я бы вычислил 4 пикселя, к которым я могу получить доступ. Так

0 1 2
3 4 5
6 7 8

я бы вычислил в среднем 4,5,7 и 8

  • 0
    Если я правильно понял, вы просто хотели проверить соседние 8 ячеек на заданный пиксель. Если исправить, то эта ситуация похожа, во многом на поиск соседних мин в игре Сапер . Один из моих учителей предложил такой подход . Я надеюсь, что это поможет и здесь :-)
  • 0
    Что нужно сделать в случае угла? Рассчитать среднее значение других пикселей? Не считаете это частью получающегося изображения?
Показать ещё 2 комментария
Теги:
indexoutofboundsexception

1 ответ

3
Лучший ответ

Нет, не провоцируйте бросание исключений, если не нужно. Это вопрос кодирования. В этом случае решение на самом деле довольно просто:

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

Это вычисляет среднее значение nxn-матрицы с x, y как центром. не должно быть слишком сложным для вас, чтобы передать это на использование с изображениями. Хотя другой подход может быть более эффективным, если вы хотите рассчитать среднее значение всех ячеек в матрице. Но это показывает основную идею.

  • 0
    Пара небольших проблем с этим. (1) Это работает только для квадратной матрицы; тогда как если это для обработки изображений, то, скорее всего, ввод будет прямоугольником. (2) В конце вы делитесь на неправильную вещь. Не должно быть n * n если усредняемая область находится близко к краю.
  • 0
    извините, должно быть легко исправить
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню