tl; dr: Это зависит от проблемы, которую вы пытаетесь решить - для этого нет решения, которое применимо ко всем проблемам. На самом деле, говоря математически, я подозреваю, что «решения» вообще не может быть, поскольку я считаю, что это некорректная проблема, с которой вам приходится сталкиваться.
(заранее извиняюсь за мое безрассудное злоупотребление математикой)
Чтобы продемонстрировать, давайте рассмотрим ситуацию, когда все компоненты пикселя и значения ядра предполагаются положительными. Чтобы получить представление о том, как некоторые из этих ответов могут ввести нас в заблуждение, давайте еще подумаем о простом усредняющем («рамочном») фильтре. Если мы установим значения за пределами границы изображения на ноль, то это явно приведет к снижению среднего значения для каждого пикселя в пределах ceil (n / 2) (манхэттенское расстояние) от границы. Таким образом, вы получите «темную» границу на отфильтрованном изображении (при условии наличия одного компонента интенсивности или цветового пространства RGB - ваши результаты будут различаться в зависимости от цветового пространства!). Обратите внимание, что аналогичные аргументы могут быть сделаны, если мы установим значения вне границы для любой произвольной константы - среднее значение будет стремиться к этой константе. Постоянная ноль может быть уместной, если края вашего типичного изображения все равно стремятся к 0. Это также верно, если мы рассмотрим более сложный фильтр ядра как гауссову, однако проблема будет менее выраженной, поскольку значения ядра имеют тенденцию быстро уменьшаться с расстоянием от центра.
Теперь предположим, что вместо использования константы мы решили повторить значения ребер. Это то же самое, что сделать рамку вокруг изображения и копировать строки, столбцы или углы достаточно много раз, чтобы фильтр оставался «внутри» нового изображения. Вы также можете думать об этом как о зажиме / насыщении координат выборки. Это имеет проблемы с нашим простым блочным фильтром, потому что он переоценивает значения краевых пикселей. Набор краевых пикселей появится несколько раз, но все они имеют одинаковый вес w=(1/(n*n))
.
Предположим, что мы отбираем краевой пиксель со значением K 3 раза. Это означает, что его вклад в среднее значение:
K*w + K*w + K*w = K*3*w
Так эффективно, что один пиксель имеет больший вес в среднем. Обратите внимание, что, поскольку это средний фильтр, вес является постоянным по отношению к ядру. Однако этот аргумент применяется к ядрам с весами, которые также меняются в зависимости от позиции (опять же: подумайте о ядре Гаусса ..).
Предположим, мы обертываем или отражаем координаты выборки, так что мы все еще используем значения из-за границы изображения. Это имеет некоторые ценные преимущества по сравнению с использованием константы, но также не обязательно является «правильным». Например, сколько фотографий вы делаете, когда объекты на верхней границе похожи на объекты внизу? Если вы не снимаете зеркально-гладкие озера, я сомневаюсь, что это правда. Если вы фотографируете камни для использования в качестве текстур в играх, может подойти упаковка или отражение. Я уверен, что здесь следует сделать важные замечания о том, как упаковка и отражение, вероятно, уменьшат любые артефакты, возникающие в результате использования преобразования Фурье. Однако это возвращается к той же идее: у вас есть периодический сигнал, который вы не хотите искажать, вводя паразитные новые частоты или переоценивая амплитуду существующих частот.
Так что вы можете сделать, если вы фильтруете фотографии ярко-красных скал под голубым небом? Очевидно, что вы не хотите добавлять оранжевую дымку в голубое небо и голубоватый пух на красных скалах. Отражение выборочной координаты работает, потому что мы ожидаем цвета, аналогичные пикселям, найденным в отраженных координатах ... если только ради аргумента мы не представляем, что ядро фильтра настолько велико, что отраженная координата будет простираться за горизонт.
Давайте вернемся к примеру фильтра коробки.Альтернатива этому фильтру - перестать думать об использовании статического ядра и вспомнить, что должно было делать это ядро.Усредняющий / блочный фильтр предназначен для суммирования компонентов пикселя, а затем деления на количество суммированных пикселей.Идея в том, что это сглаживает шум.Если мы хотим снизить эффективность подавления шума вблизи границы, мы можем просто сложить меньшее количество пикселей и разделить на соответственно меньшее число.Это может быть расширено для фильтров с аналогичными терминами, которые я буду называть «нормализующими» - терминами, которые связаны с площадью или объемом фильтра.Для терминов «площадь» вы подсчитываете количество весов ядра, которые находятся в пределах границы, и игнорируете те весы, которые не являются.Затем используйте этот счет как «площадь» (что может потребовать дополнительного умножения).Для объема (опять же: принимая положительные веса!) Просто сложите веса ядра.Эта идея, вероятно, ужасна для производных фильтров, потому что меньше пикселей, чтобы конкурировать с шумными пикселями, а дифференциалы общеизвестно чувствительны к шуму.Кроме того, некоторые фильтры были получены с помощью числовой оптимизации и / или эмпирических данных, а не с помощью ab-initio / аналитических методов, и, таким образом, может отсутствовать очевидный «нормализующий» фактор.