2012-09-10 7 views
1

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

laplacian = del2(image); 

против

[x, y] = gradient(image); 
[xx, xy] = gradient(x); 
[yx, yy] = gradient(y); 
laplacian = xx + yy; 

Не должны они приходят к одному и тому же? Они особенно расходятся, когда один включает dx-член.

Положив мой пример здесь, в случае она помогает: У меня есть поле тест, состоящий из

[5; 2.5+2.5i; 5i; -2.5+2.5i; -5; -2.5-2.5i; -5i; 2.5-2.5i] 

раз транспонированной (я могу отправить всю матрицу, если это помогает). Внутренний блок (3: 6, 3: 6) del2() этого поля:

[-2.5   -0.625-0.625i -2.5i   0.625-0.625i ; 
-0.625+0.625i 0    -0.625+0.625i 0   ; 
    2.5i   -0.625+0.625i -2.5   -0.625+0.625i ; 
    0.625+0.625i 0    -0.625+0.625i 0   ] 

в то время как внутренний блок (3: 6, 3: 6) хх + уу является:

[-5    -2.5-2.5i  -5i   -2.5-2.5i  ; 
-2.5+2.5i  -2.5   -2.5-2.5i  -2.5i   ; 
    5i   -2.5+2.5i  -5    -2.5-2.5i  ; 
    2.5+2.5i  2.5i   -2.5+2.5i  -2.5   ] 

, который, как вы можете видеть, внесет существенные изменения в любые дальнейшие уравнения. У кого-нибудь есть объяснение, спасибо большое!

+0

Какая функция представляет собой вашу переменную 'image'? –

+0

Это изображение, загруженное через imread(). – barnhillec

+0

Вы посмотрели исходный код? "type del2 «,« градиент типа » –

ответ

1

Если вы внимательно посмотрите на документацию Matlab, лапласиан f в (x, y), del2 (f (x, y)) вычисляется с использованием только (x, y) и ее ближайших соседей: x + 1, x-1, y + 1, y-1.

То же самое касается функции градиента (и расходимости, которая явно использует функцию градиента). Вычисление градиента дважды включает ближайших соседей ближайших соседей. Поэтому div (grad (f (x, y)) фактически вычисляется с использованием (x, y) и x + 2, x-2, y + 2, y-2. Следовательно, разница.

Большая сетка расстояние между ними, тем больше будет расхождение между этими двумя вычислениями.

+0

Это правильно. Я сам это узнал, но так и не вернулся к этому вопросу. Итак, вы получите ответ. :) – barnhillec

1

Как вы можете видеть на documentation of del2, он отличается коэффициентом 1/4 с помощью метода gradient, с которым вы сравнили его.

Это отчасти объясняет этот фактор 4 в вашем примере. Я обвиняю остальных в краевых эффектах: p

+1

Да или остальное может быть checkerboarding, потому что тестовое поле настолько низкое. Просто подумал об этом. Благодарю. – barnhillec

+0

@GuntherStryuf Привет всем. Я рассматривал этот вопрос, потому что у меня возникла аналогичная проблема. Правильно ли работает оператор лапласа, определенный Matlab? Разве не должно быть, что расхождение градиента вектора равно лапласианскому? Почему MATLAB делает экстраполяцию по краям? – roni

+0

1. Как они выразились в их документации, это выглядит правильно для меня. 2. 'div (градиент (F (X))) == laplacian (F (X)) ', так что да, разве это не в реализации matlab? не использовали его на самом деле. Я предлагаю вам провести несколько тестов, чтобы узнать, что подходит вашим потребностям. 3. Экстраполяция по краям выполняется для сохранения того же размера вектора –

Смежные вопросы