Лапласиан гауссовский - PullRequest
       8

Лапласиан гауссовский

5 голосов
/ 01 апреля 2010

У меня проблемы с реализацией ядра LoG. Я пытаюсь реализовать 9x9 Kernal с тета = 1,4, как показано в этой ссылке http://homepages.inf.ed.ac.uk/rbf/HIPR2/log.htm.

Однако у меня возникают трудности с самой формулой. Если бы кто-то мог сказать мне, как рассчитать центр, то есть какие значения x и y использовать, чтобы получить -40 в ядре 9x9, это было бы очень полезно.

Ответы [ 2 ]

2 голосов
/ 01 апреля 2010

Вам не нужно беспокоиться о формуле - она ​​просто используется для генерации коэффициентов. Вам просто нужно применить эти коэффициенты 9x9 к вашему изображению.

Пример (непроверенный код!):

const int K = 9;
const int K2 = K / 2;
const int NORM = 500; // constant for normalising filter gain
const int coeffs[K][K] = { ... };
int in_image[M][N];
int out_image[M][N];

for (i = K2; i < M - K2; ++i)
{
    for (j = K2; j < N - K2; ++j)
    {
        int term = 0;
        for (di = -K2; di <= K2; ++di)
        {
            for (dj = -K2; dj <= K2; ++dj)
            {
                term += in_image[i + di][j + dj] * coeff[K2 + ii][K2 + jj];
            }
        }
        out_image = term / NORM;
    }
}
1 голос
/ 02 апреля 2010

Недавно я внедрил фильтр LoG, единственное, что вам нужно, это формула и сигма в качестве параметра.Если вам нужна маска фиксированного размера, вы можете сохранить значения маски фильтра в матрице и использовать ее или пересчитывать каждый раз и создавать необходимую матрицу.Размер фильтра зависит от значения сигмы, если используется больше, чем этот размер - это не имеет смысла, потому что оставшаяся часть, которая имеет некоторый максимальный размер, рассчитывается по нулям с использованием этой формулы.Так, например, вы получили размер фильтра = 9X9. Затем, чтобы рассчитать сам фильтр как матрицу, вам нужно выполнить формулу через следующие значения:

int halfsize = size / 2;    
for (int x = -halfsize; x < halfsize; ++x)
   for (int y = -halfsize; y < halfsize; ++y)
       mask[x][y] = LoGFunction(x, y);

Что-то в этом роде.Это также означает, что размер фильтра должен быть нечетным.Надеюсь это поможет.В вашем случае, размер = 9 сигма = 1,4 х, а у изменяется от -4 до 4. Используя формулу в точке (0, 0) (это центр фильтра), вы получите что-то около -12

Но если вы установите сигму на 0,2986, вы получите необходимый ответ около -40.Я также не понимаю, почему написано, что значение сигмы равно 1,4 мая, если я что-то упустил ... Поправьте меня, если я допустил ошибку, пожалуйста

...