Как обработать возможный выход за границу массива и продолжить выполнение программы, избежав ошибки
Решаю учебную задачу, нужно написать код для обработки изображения с камеры для робота-пылесоса, которого пнула хозяйка, и теперь ему нужно сориентироваться в пространстве))
В данный момент пишу код для медианного фильтра. Суть в том, что нужно для каждого пикселя в изображении (которое представлено в виде двумерного массива) взять его окрестные пиксели, поместить в массив, отсортировать этот массив, а затем вернуть средний элемент этого массива - это и будет итоговый цвет обрабатываетмого пикселя. Как нетрудно догадаться, для пикселей в центре изображения количество окрестных пикселей будет 8, для пикселей по периметру 5, а для угловых пикселей - 3, и это нужно как-то обработать.
Я хочу решить эту задачу, избежав использования целой кучи if-ов для проверок на то, не является ли обрабатываемый пиксель крайним или угловым. Пока что, так как пикселей в середине изображения намного больше, чем по периметру, я решил обработать сначала их - это можно сделать без if-ов вообще. Но вот с пикселями по периметру вышел затык. Как ни крути, а проверка для них понадобится... Или же нет?
Если бы можно было создать метод или локальную функцию, которая бы принимала индекс обрабатываемого пикселя и пробовала запросить для него значения соседних пикселей, а в случае неудачи (ввиду того, что пикселя не существует) просто продалжала работу с теми пикселями, значения которых удастся получить, то это было былучшим решением данной задачи, как мне кажется. Подскажите, пожалуйста, такой вариант возможен?
Ответы (3 шт):
Так сделайте функцию, которая возвращает список индексов соседей. А потом этот список и обрабатывайте. Условные операторы всё равно придётся использовать, но уже в отдельной функции, которая формирует список индексов соседей. Так будет проще управлять кодом.
Обрабатываете область 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
Особые случаи - угловые и линейные - обрабатывай отдельно от остальных.