2D дискретный лапласиан (del2) в C ++ - PullRequest
5 голосов
/ 09 мая 2011

Я пытаюсь выяснить, как перенести функцию del2 () в matlab на C ++.

У меня есть пара масок, с которыми я работаю, это единицы и нули, поэтому я написал код liket его:

for(size_t i = 1 ; i < nmax-1 ; i++)

{
    for(size_t j = 1 ; j < nmax-1 ; j++)

    {
        transmask[i*nmax+j] = .25*(posmask[(i+1)*nmax + j]+posmask[(i-1)*nmax+j]+posmask[i*nmax+(j+1)]+posmask[i*nmax+(j-1)]);

    }
}

для расчета внутренних точек лапласиан. Я думаю, согласно некоторой информации в "doc del2" в matlab, граничные условия просто используют доступную информацию для вычисления, верно? Так что я думаю, мне просто нужно написать случаи для граничных условий при i, j = 0 и nmax

Тем не менее, я думаю, что эти значения из кода, который я разместил здесь, будут правильными для внутренних точек, как есть, но кажется, что результаты del2 отличаются!

Я копался в источнике del2, и мне кажется, мне не хватает мастера Matlab, чтобы выяснить, что происходит с некоторым кодом для внутренних вычислений

Ответы [ 3 ]

5 голосов
/ 10 мая 2011

Вы можете увидеть код del2 по edit del2 или type del2. Обратите внимание, что del2 выполняет кубическую интерполяцию на границах.

3 голосов
/ 09 мая 2011

Проблема в том, что линия у вас там:

transmask[i*nmax+j] = .25*(posmask[(i+1)*nmax + j]+posmask[(i-1)*nmax+j]+posmask[i*nmax+(j+1)]+posmask[i*nmax+(j-1)]);  

вовсе не дискретный лапласиан.

Что у вас есть (I (i + 1, j) + I (i-1, j) + I (i, j + 1) + I (i, j-1)) / 4

Я не знаю, что это за маска, но дискретный лапласиан (при условии, что расстояние между каждым пикселем в каждом измерении равно 1):

(- 4 * I (i, j) + I (i + 1, j) + I (i-1, j) + I (i, j + 1) + I (i, j-1))

Так что, по сути, вы пропустили термин, и вам не нужно делить на 4. Я предлагаю вернуться и заново извлечь дискретный лапласиан из его определения, которое является второй x производной изображения плюс вторая производная y от изображение.

Редактировать: Я вижу, откуда вы взяли /4, поскольку Matlab по какой-то причине использует это определение (хотя математически это не стандартно).

3 голосов
/ 09 мая 2011

Я думаю, что с помощью компилятора Matlab вы можете конвертировать m-код в C-код.Вы пробовали это?

Я нашел эту ссылку, где объясняется другой метод конвертации в C.

http://www.kluid.com/mlib/viewtopic.php?t=337

Удачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...