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
Нет, не провоцируйте бросание исключений, если не нужно. Это вопрос кодирования. В этом случае решение на самом деле довольно просто:
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 как центром. не должно быть слишком сложным для вас, чтобы передать это на использование с изображениями. Хотя другой подход может быть более эффективным, если вы хотите рассчитать среднее значение всех ячеек в матрице. Но это показывает основную идею.
n * n
если усредняемая область находится близко к краю.