Как обработать возможный выход за границу массива и продолжить выполнение программы, избежав ошибки

Решаю учебную задачу, нужно написать код для обработки изображения с камеры для робота-пылесоса, которого пнула хозяйка, и теперь ему нужно сориентироваться в пространстве))

В данный момент пишу код для медианного фильтра. Суть в том, что нужно для каждого пикселя в изображении (которое представлено в виде двумерного массива) взять его окрестные пиксели, поместить в массив, отсортировать этот массив, а затем вернуть средний элемент этого массива - это и будет итоговый цвет обрабатываетмого пикселя. Как нетрудно догадаться, для пикселей в центре изображения количество окрестных пикселей будет 8, для пикселей по периметру 5, а для угловых пикселей - 3, и это нужно как-то обработать.

Я хочу решить эту задачу, избежав использования целой кучи if-ов для проверок на то, не является ли обрабатываемый пиксель крайним или угловым. Пока что, так как пикселей в середине изображения намного больше, чем по периметру, я решил обработать сначала их - это можно сделать без if-ов вообще. Но вот с пикселями по периметру вышел затык. Как ни крути, а проверка для них понадобится... Или же нет?

Если бы можно было создать метод или локальную функцию, которая бы принимала индекс обрабатываемого пикселя и пробовала запросить для него значения соседних пикселей, а в случае неудачи (ввиду того, что пикселя не существует) просто продалжала работу с теми пикселями, значения которых удастся получить, то это было былучшим решением данной задачи, как мне кажется. Подскажите, пожалуйста, такой вариант возможен?


Ответы (3 шт):

Автор решения: alvahtin

Так сделайте функцию, которая возвращает список индексов соседей. А потом этот список и обрабатывайте. Условные операторы всё равно придётся использовать, но уже в отдельной функции, которая формирует список индексов соседей. Так будет проще управлять кодом.

→ Ссылка
Автор решения: MBo

Обрабатываете область c индексами от 1 до width-2 и аналогично по высоте - проверки не нужны
Обрабатываете две строки горизонтальных пикселов от 1 до width-2, учитывая 5 соседей - проверки не нужны
Обрабатываете две колонки вертикальных пикселов от 1 до height-2, учитывая 5 соседей - проверки не нужны Обрабатываете 4 угла, учитывая трех соседей


Если однообразно хочется, то (будет чуть помедленнее)

for (int y = 0; y < height; y++) {
    for (int x = 0; x < width; x++ {
    //обработка области с центром в (y,x)
        int count = 0;
        for (int dy = max(0,y-size); dy <= min(y+size, height-1); dy++) {
           for (int dx = max(0,x-size); dx <= min(x+size, width-1); dx++) {
              Med[count++] = A[dy][dx];
           }
        }
        Array.Sort(Med, 0, count-1);
        MedianArr[y][x] = Med[count/2];
    }
 }

Однако прямая реализация принципа медианной фильтрации не быстро работает. Если нужна скорость, то воспользуйтесь, например, библиотекой OpenCV

→ Ссылка
Автор решения: Qwer

Особые случаи - угловые и линейные - обрабатывай отдельно от остальных.

→ Ссылка