Дискретная числовая производная по dx › 1

Как создать трафарет для оператора d/d(n*x)?

Я пишу программу, которая должна вычислять производные линии на изображении. Если мы хотим вычислить простейшую аппроксимацию производной относительно d/dx, мы можем запустить следующую операцию:

diff[x] = -1.0 * image[x] + image[x+1]

Если мне нужен более точный расчет производной, я могу увеличить размер трафарета и, возможно, пересчитать как:

diff[x] = -3./2 * image[x] + 2*image[x+1] - 1./2 * image[x+2]

Я использовал метод конечных разностей для получения этих коэффициентов.

Теперь предположим, что я хочу взять производную относительно d/d(3*x), я мог бы просто растянуть исходный шаблон следующим образом:

diff[x] = -1.0 * image[x] + image[x+3]

Однако здесь я не использую информацию из изображений [x+1] и изображений [x+2], поэтому аппроксимация производной может быть значительно улучшена. Как я могу создать трафарет, который БУДЕТ использовать эту информацию и, следовательно, будет более точным?


person Boyko Perfanov    schedule 11.03.2013    source источник
comment
Почему бы не использовать d/d(n*x) = d/d(x)/n?   -  person fdermishin    schedule 11.03.2013
comment
Возьмите d/dx (4x^2), а затем подставьте y=2*x, возьмите d/dy (y^2), и вы получите ответ на свой вопрос.   -  person Boyko Perfanov    schedule 11.03.2013
comment
Так что в данном случае это работает.   -  person fdermishin    schedule 11.03.2013
comment
Упс, на первый взгляд эта формула работает. В любом случае, использование d/dx в основном зависит только от 2 или 3 пикселей и подвержено шуму, кроме того, результаты при масштабировании изображения различаются. Это не постоянный результат.   -  person Boyko Perfanov    schedule 11.03.2013
comment
Если вы хотите, чтобы производная была устойчива к шуму, вы можете предварительно обработать изображение, сгладив его. Сглаживание и взятие производной можно совместить в одном операторе. Если изображение масштабируется, то его производная масштабируется с тем же коэффициентом, поэтому я не вижу здесь никакой проблемы.   -  person fdermishin    schedule 11.03.2013


Ответы (2)


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

person sansuiso    schedule 11.03.2013
comment
Ребята с биржи математических стеков тоже не смогли понять, поэтому я воспользовался вашим методом. Однако вместо понижения дискретизации изображения я повышаю дискретизацию ядра, добавляя нули между ненулевыми коэффициентами фильтра. Это работает довольно хорошо, хотя это не идеальное решение. - person Boyko Perfanov; 13.03.2013
comment
В этом случае вы также можете попробовать интерпретацию производных Фурье (умножение БПФ на j*omega). - person sansuiso; 14.03.2013

Два предложения:

  • во-первых, вообще, используйте центрированные вычисления. Таким образом, первая производная высшего порядка равна 0.5*(image[x+1]-image[x-1])

  • во-вторых, используйте цепную формулу, чтобы вывести «относительно 3x». В своей простейшей форме формально df/dy = df/dx*dx/dy означает, что dImage/d(3x) = dImage/dx*(1/3) Короче говоря, просто делится на 3.

person nbonneel    schedule 11.03.2013