Подтвердить что ты не робот

Лапласиан гауссовского фильтра

Это формула для фильтрации LoG: alt text
(источник: ed.ac.uk)

Также в приложениях с фильтрацией LoG я вижу, что функция вызывается только с одним параметром: sigma (σ). Я хочу попробовать фильтрацию LoG, используя эту формулу (предыдущая попытка была по гауссовскому фильтру, а затем по лапласианскому фильтру с некоторым размером окна фильтра). Но, глядя на эту формулу, я не могу понять, как размер фильтра связан с этой формулой, не так ли? значит, что размер фильтра фиксированный? Можете ли вы объяснить, как его использовать?

4b9b3361

Ответ 1

Как вы, наверное, уже поняли из других ответов и ссылок, фильтр LoG обнаруживает края и линии на изображении. Чего еще не хватает, так это объяснения того, что такое σ.

σ - масштаб фильтра. Линия шириной в один пиксель - это линия или шум? Линия шириной 6 пикселей - это линия или объект с двумя разными параллельными краями? Является ли градиент, который меняется с черного на белый через 6 или 8 пикселей, краем или просто градиентом? Это то, что вы должны решить, и значение σ отражает ваше решение: чем больше σ, тем шире линии, сглажены края, и больше шума игнорируется.

Не запутайтесь между масштабом фильтра (σ) и размером дискретного приближения (обычно это называется трафарет). В Пауле ссылка σ = 1.4, а размер трафарета равен 9. Хотя обычно целесообразно использовать размер трафарета от 4σ до 6σ, эти две величины совершенно независимы. Трафарет большего размера обеспечивает лучшее приближение фильтра, но в большинстве случаев вам не нужно очень хорошее приближение.

Ответ 2

Это тоже меня смутило, и только когда мне пришлось сделать то же самое, что и вы, для универ-проекта, я понял, что вы должны делать с формулой!

Вы можете использовать эту формулу для генерации дискретного фильтра LoG. Если вы напишете немного кода для реализации этой формулы, вы сможете создать фильтр для использования в свертке изображений. Для генерации, скажем, шаблона 5x5, просто вызовите код с x и y в диапазоне от -2 до +2.

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

LoG template
(источник: ed.ac.uk)

Вы можете точно настроить шаблон, изменив его ширину (размер) и значение сигмы (насколько широкий пик). Чем шире и шире шаблон, тем меньше будет шума, потому что он будет работать в более широкой области.

Когда у вас есть фильтр, вы можете применить его к изображению, свернув шаблон с изображением. Если вы еще этого не сделали, ознакомьтесь с этими несколькими уроками. Java- апплеты учебники более математике.

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

Приведенный ниже код дает общее представление о том, как вы могли бы реализовать это. Пожалуйста, прости любые ошибки/опечатки и т.д., Поскольку он не был проверен.

Надеюсь, это поможет.

private float LoG(float x, float y, float sigma)
{
    // implement formula here
    return (1 / (Math.PI * sigma*sigma*sigma*sigma)) * //etc etc - also, can't remember the code for "to the power of" off hand
}

private void GenerateTemplate(int templateSize, float sigma)
{
    // Make sure it an odd number for convenience
    if(templateSize % 2 == 1)
    {
        // Create the data array
        float[][] template = new float[templateSize][templatesize];

        // Work out the "min and max" values. Log is centered around 0, 0
        // so, for a size 5 template (say) we want to get the values from
        // -2 to +2, ie: -2, -1, 0, +1, +2 and feed those into the formula.
        int min = Math.Ceil(-templateSize / 2) - 1;
        int max = Math.Floor(templateSize / 2) + 1;

        // We also need a count to index into the data array...
        int xCount = 0;
        int yCount = 0;

        for(int x = min; x <= max; ++x)
        {
            for(int y = min; y <= max; ++y)
            {
                // Get the LoG value for this (x,y) pair
                template[xCount][yCount] = LoG(x, y, sigma);
                ++yCount;
            }
            ++xCount;
        }
    }
}

Ответ 3

Просто для визуализации, вот простой цветной график Matlab 3D лапласа гауссова (мексиканской шляпы) вейвлета. Вы можете изменить параметр сигмы (σ) и увидеть его влияние на форму графика:

sigmaSq = 0.5 % Square of σ parameter
[x y] = meshgrid(linspace(-3,3), linspace(-3,3)); 
z = (-1/(pi*(sigmaSq^2))) .* (1-((x.^2+y.^2)/(2*sigmaSq))) .*exp(-(x.^2+y.^2)/(2*sigmaSq)); 
surf(x,y,z)

Вы также можете сравнить эффекты параметра sigma на мексиканской шляпе, выполнив следующие действия:

t = -5:0.01:5;
sigma = 0.5;

mexhat05 = exp(-t.*t/(2*sigma*sigma)) * 2 .*(t.*t/(sigma*sigma) - 1) / (pi^(1/4)*sqrt(3*sigma));

sigma = 1;
mexhat1 = exp(-t.*t/(2*sigma*sigma)) * 2 .*(t.*t/(sigma*sigma) - 1) / (pi^(1/4)*sqrt(3*sigma));

sigma = 2;
mexhat2 = exp(-t.*t/(2*sigma*sigma)) * 2 .*(t.*t/(sigma*sigma) - 1) / (pi^(1/4)*sqrt(3*sigma));

plot(t, mexhat05, 'r', ...
     t, mexhat1, 'b', ...
     t, mexhat2, 'g');

Или просто используйте набор инструментов Wavelet, предоставленный Matlab, следующим образом:

lb = -5; ub = 5; n = 1000; 
[psi,x] = mexihat(lb,ub,n); 
plot(x,psi), title('Mexican hat wavelet')

Я нашел это полезным при реализации этого для обнаружения края в компьютерном зрении. Хотя это не точный ответ, надеюсь, что это поможет.

Ответ 4

Кажется, это сплошной круглый фильтр, радиус которого равен sqrt (2) * sigma. Если вы хотите реализовать это для обработки изображений, вам необходимо приблизиться к нему.

Здесь приведен пример для сигма = 1.4: http://homepages.inf.ed.ac.uk/rbf/HIPR2/log.htm