2012-04-12 11 views
1

Я намерен peform лапласиана гауссовского оператора края в MATLAB ..лапласиан гауссова (LOG) детектора края в MATLAB

Это знание я есть

LOG operators are second-order deriatives operator. Second order deriatives operator result in zero-crossing. At the step, position where 1st deriative is maximum is where the second deriative has zero crossing. 

Маска я используется маска = [0 1 0; 1 -4 1; 0 1 0];

Исходное изображение

enter image description here

Выход я получаю от исходного изображения

enter image description here

Мой вопрос почему края в изображении появляются белые, а не черные (= 0). Должна ли она быть черной? Правильно или неправильно? может кто-нибудь объяснить?

свертка функции:

function [ I2 ] = image_convolution(I,w,G) 
m= (w-1)/2; 
N= size(I,1); 
M=size(I,2); 
for i=1:N 
    for j=1:M 
     if (i > N-m-1 || j > M-m-1 || i<m+1 || j <m+1) 
      I2(i,j) = 0; 
      continue; 
     end 
     sum1 = 0; 
     for u=1:w 
      for v=1:w 
       sum1 = sum1+I(i+u-m-1,j+v-m-1)*G(u,v); 
      end 
     end 
     I2(i,j)=sum1; 
    end 
end 

end 
+0

вы используете imshow, чтобы построить свой имидж? – Castilho

+0

ya..i использую imshow ... – lakesh

+0

Они должны быть белыми. Ядро, которое вы используете, предназначено только для «Лапласиан». Лапласиан гауссова, как следует из названия, сначала берет гауссовский образ. Почему бы вам просто не искать это в Google? Это действительно стоит спросить на форуме? в любом случае .. heres a [link] (http://fourier.eng.hmc.edu/e161/lectures/gradient/node10.html). – nac

ответ

10

Простой тест может ответить на все ваши вопросы:

log_mask = [0 1 0; 1 -4 1; 0 1 0]; 

vertical_bar = zeros(11); 
vertical_bar(:,5) = 1; 
bar_filtered = image_convolution(vertical_bar, 3, log_mask) 

box = zeros(11); 
box(3:7,3:7) = 1; 
box_filtered = image_convolution(box, 3, log_mask) 

figure; 
subplot(2,2,1); imshow(vertical_bar,[]); title('Vertical Bar'); 
subplot(2,2,2); imshow(bar_filtered,[]);title('Vertical Bar LoG Filtered'); 
subplot(2,2,3); imshow(box,[]);title('Box'); 
subplot(2,2,4); imshow(box_filtered,[]);title('Box LoG Filtered'); 


# Output: 
# 
# bar_filtered = 
# 0  0  0  0  0  0  0  0  0  0  0 
# 0  0  0  1 -2  1  0  0  0  0  0 
# 0  0  0  1 -2  1  0  0  0  0  0 
# 0  0  0  1 -2  1  0  0  0  0  0 
# 0  0  0  1 -2  1  0  0  0  0  0 
# 0  0  0  1 -2  1  0  0  0  0  0 
# 0  0  0  1 -2  1  0  0  0  0  0 
# 0  0  0  1 -2  1  0  0  0  0  0 
# 0  0  0  1 -2  1  0  0  0  0  0 
# 0  0  0  0  0  0  0  0  0  0  0 
# 0  0  0  0  0  0  0  0  0  0  0 

#box_filtered = 

# 0  0  0  0  0  0  0  0  0  0  0 
# 0  0  1  1  1  1  1  0  0  0  0 
# 0  1 -2 -1 -1 -1 -2  1  0  0  0 
# 0  1 -1  0  0  0 -1  1  0  0  0 
# 0  1 -1  0  0  0 -1  1  0  0  0 
# 0  1 -1  0  0  0 -1  1  0  0  0 
# 0  1 -2 -1 -1 -1 -2  1  0  0  0 
# 0  0  1  1  1  1  1  0  0  0  0 
# 0  0  0  0  0  0  0  0  0  0  0 
# 0  0  0  0  0  0  0  0  0  0  0 
# 0  0  0  0  0  0  0  0  0  0  0 

В Результаты фильтрации отображаются в графическом виде: enter image description here

См?Пикселы ровно на границе имеют действительно отрицательные значения, как и ожидалось. С другой стороны, пиксели рядом с границей имеют положительные значения! Большие значения, чем значения в области, где сигнал постоянный. Это «белые» значения, которые вы видите по вашему результату.

Математически, это также легко объяснить. Посмотрите на маске вы использовали

LoG mask used

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

Я создал маску, созданную с помощью функции matlab fspecial('log'). В этом максе пики еще легче обнаружить. enter image description here

С наилучшими пожеланиями

+0

Привет, мне действительно интересно, как вы визуализируете матрицы в 3D. У меня действительно тяжелое время, чтобы понять, как это сделать. Благодарю. –

+0

Nvm. Я предполагаю, что это 'bar3'? Это не реализовано в Octave, с чего я сейчас пытаюсь уйти. Однако существуют различные способы обхода, так что это круто –

0

Это связано с тем, как свертка вычисленной. Когда ваше ядро ​​(ваша маска) свернуто в границах, ядро ​​достигает области вне исходного изображения. Есть несколько вариантов, о том, что там делать:

  • вы можете принимать значения в этом за пределами области, чтобы быть 0,
  • , чтобы иметь то же значение, как границы,
  • или быть таким же, как противоположную сторону изображения, как если бы изображение было периодическим (круговым).

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

Если вы используете imfilter, функция по умолчанию предполагает, что эта область равна 0. Вы можете использовать опцию «replicate» (поэтому внешняя область такая же, как и граница), и она должна решить эту проблему.

Вы можете прочитать об этом в официальных документах: http://www.mathworks.com/help/toolbox/images/ref/imfilter.html

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

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

PS: Я не использовал это через некоторое время. Дайте мне знать, работает ли imfilter так, как я сказал, или вам нужно что-то еще.

+0

Я не использовал функцию conv2 ... я написал свою собственную функцию свертки ... – lakesh

+0

Если вы действительно хотите использовать свои собственные, тогда вам нужно адаптироваться, чтобы получить то, что вам нужно. Но кроме того, чтобы узнать, как это работает, нет никакой выгоды в том, чтобы изобретать колесо, и вы получите лучшие и быстрые результаты, используя уже доступные функции. – jpimentel

0

Простое решение: Использование

imshow(image,[])

Вместо

imshow(image)

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