Итак, с одной стороны, вы хотите сохранить простоту, с другой стороны, вы хотите, чтобы ваша программа работала хорошо.Ага.
На самом деле я делаю что-то подобное, хотя меня не волнует граница.Мне нравится основывать коэффициенты на кубических B-сплайнах.Если вы свернете свой дискретный 2D-сигнал с помощью 2D-кубического B-сплайна, вы получите очень плавную и дважды непрерывно дифференцируемую функцию.Можно вычислить точные интенсивности и производные этой функции в произвольных точках.Поскольку кубический B-сплайн не является интерполятором, результат будет немного сглажен по сравнению с оригиналом.Но это не проблема для многих приложений.Фактически, это имеет тенденцию улучшать вещи (подавляя шум до некоторой степени) во многих ситуациях.Если вам не нужен этот эффект сглаживания, вы можете обойти его (см. Мою ссылку ниже).
В одном измерении реконструкция с использованием кубического B-сплайна в качестве фильтра реконструкции с последующей повторной выборкой сигнала эквивалентнадля свертки сигнала с
1/6 4/6 1/6
Производная точная этого равна:
1/2 0 -1/2
И точная вторая производная равна:
1 -2 1
Эти коэффициенты следуют из кубической кривой B-сплайна и ее производных.В 2D вы можете комбинировать это произвольно.Один фильтр для направления x и один фильтр для направления y.Примеры:
"B-Spline reconstruction" (divisor=36)
1 4 1
4 16 4
1 4 1
"B-Spline differentiator in X" (divisor=12)
1 0 -1
4 0 -4
1 0 -1
"B-Spline, 2nd derivative in X, 1st derivative in Y" (divisor=2)
1 -2 1
0 0 0
-1 2 -1
Приятно то, что отфильтрованные результаты не точно соответствуют исходному сигналу, а лишь слегка сглаженной версии, но, тем не менее, согласуются друг с другом.Вы можете обойти эффект сглаживания, используя простой прием предварительной обработки, который описан здесь .Вы также будете, но в зависимости от того, что вы действительно хотите сделать, эта предварительная обработка может быть неуместной.
Я использую это для вычисления квадратичных приближений Тейлора в произвольных (подпиксельных) точках, чтобы найти такие вещи, как седловые точки иэкстремумы.
Если вы заботитесь о границе, вам нужно каким-то образом выбрать экстраполяцию, соответствующую вашим потребностям.Я обычно просто повторяю значения пикселей последних пикселей.Это хорошо работает для моих приложений *.