2010-03-30 3 views
12

Это формула для фильтрации LOG: alt text http://homepages.inf.ed.ac.uk/rbf/HIPR2/eqns/eqnlog2.gifлапласиана гауссовского использования фильтра

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

ответ

6

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

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

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

+0

Значение sigma (σ) постоянное, или мы должны взять его по собственному усмотрению? –

1

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

Там пример для сигмы = 1,4 здесь: http://homepages.inf.ed.ac.uk/rbf/HIPR2/log.htm

+0

Я сделал приближение по разнице гауссовых, но я не хочу использовать это приближение. О какой аппроксимации вы говорите? – maximus

+0

@maximums: вы * читаете * страницу, с которой я связан? Это непрерывная функция, поэтому вам нужно приблизить ее для дискретной обработки изображений. Существует пример набора коэффициентов для sigma = 1.4 на странице, с которой я связан, и достаточно информации для вас, чтобы генерировать коэффициенты для любого значения сигмы, которое вам нужно. –

+0

Спасибо, я тебя достал! – maximus

5

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

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

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

LoG template http://homepages.inf.ed.ac.uk/rbf/HIPR2/figs/logcont.gif

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

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

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

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

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

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's 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; 
     } 
    } 
} 
+0

Большое спасибо, я пробовал! – maximus

+0

Как сказал Павел в предыдущем ответе , он представляется фильтром, радиус которого равен sqrt (2) * сигма. Если это так, размер фильтра зависит только от значения сигмы, , тогда значение сигмы - это только то, что необходимо. Однако я не уверен, и, возможно, также можно использовать независимые параметры как сигма и размер шаблона. – maximus

2

Для визуализации здесь представлен простой цветной график 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) 

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

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') 

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

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