Изображение это строка, когда я пытаюсь выполнить не максимальное подавление в Matlab
Итак, я написал этот код в Matlab, который должен выполнять немаксимальное подавление. по сути, он должен сравнивать данную точку с ее соседями, и если она выше, чем у всех соседей, установите эту точку на 1, иначе на ноль.
когда я запускаю код, изображение, которое я имею, является линией. где может быть ошибка.
<function newMagnitudeImage = NonMaximalSuppression(magnitude,orientation)
[m,n]=size('Brainweb');
% Discretization of directions
orientationdis= zeros(m,n);
for i = 1 : m
for j = 1 : n
if ((orientation(i, j) > 0 ) && (orientation(i, j) < (pi/8)) || (orientation(i, j) > (7*pi/8)) && (orientation(i, j) < (-7*pi/8)))
orientationdis(i, j) = 0;
end
if ((orientation(i, j) > (pi/8)) && (orientation(i, j) < (3*pi/8)) || (orientation(i, j) < (-5*pi/8)) && (orientation(i, j) > (-7*pi/8)))
orientationdis(i, j) = pi/4;
end
if ((orientation(i, j) > (3*pi/8)) && (orientation(i, j) < (5*pi/8)) || (orientation(i, j) < (-3*pi/8)) && (orientation(i, j) > (5*pi/8)))
orientationdis(i, j) = pi/2;
end
if ((orientation(i, j) > (5*pi/8) && (orientation(i, j) <= (7*pi/8)) || (orientation(i, j) < (-pi/8) && (orientation(i, j) > (-3*pi/8)))))
orientationdis(i, j) = 3*pi/4;
end
end
end
newMagnitudeImage = zeros(m, n);
for i = 2 : m-1
for j = 2 : n-1
if (orientationdis(i, j) == 0)
if (magnitude(i, j) > magnitude(i, j - 1) && magnitude(i, j) > magnitude(i, j + 1))
newMagnitudeImage(i, j) = magnitude(i, j);
else
newMagnitudeImage(i, j) = 0;
end
end
if (orientationdis(i, j) == 45)
if (magnitude(i, j) > magnitude(i + 1, j - 1) && magnitude(i, j) > magnitude(i - 1, j + 1))
newMagnitudeImage(i, j) = magnitude(i, j);
else
newMagnitudeImage(i, j) = 0;
end
end
if (orientationdis(i, j) == 90)
if (magnitude(i, j) > magnitude(i - 1, j) && magnitude(i, j) > magnitude(i + 1, j))
newMagnitudeImage(i, j) = magnitude(i, j);
else
newMagnitudeImage(i, j) = 0;
end
end
if (orientationdis(i, j) == 135)
if (magnitude(i, j) > magnitude(i - 1, j - 1) && magnitude(i, j) > magnitude(i + 1, j + 1))
newMagnitudeImage(i, j) = magnitude(i, j);
else
newMagnitudeImage(i, j) = 0;
end
end
end
end
2 ответа
Я надеюсь, что я понимаю, но вы можете применить операции скользящего соседства с nlfilter
,
Например, вы можете сделать:
I = randi([1,10],10,10);
fun = @(x) max(x(:));
I2 = nlfilter(I,[3 3],fun); %calculate the maximum of the neighborhood.
ind = I==I2; %is each element a local maximum ?
%suppression if the value is not the maximum of the neighborhood.
I(~ind) = NaN;
nlfilter
требуется набор инструментов для обработки изображений
В верхней части кода вы дискретизируете от 0 до 3* пи /4 в радианах, но в нижней половине вы проверяете в градусах. Вы должны изменить два, чтобы они совпали (т.е. изменить ==45 на == pi/4 и т. Д.)
Кажется, что в коде может быть больше проблем - почему вы дискретизируете только от 0 до 135 градусов?
РЕДАКТИРОВАТЬ: гораздо более короткая версия того же кода [Требуется набор инструментов для обработки изображений]:
orientationdis = mod(round(orientation/(pi/4)),4)*pi/4 %map orientation to correct value of from 0 to pi, rounded to the nearest pi/4
newMagnitudeImage = (imdilate(orientation,[0 1 0; 1 1 1; 0 1 0])==orientation).*magnitude; %Find the maximum value in each neighborhood, compare to the original values, set non-maximum values to 0 and maximum values to original value from magnitude
Если вы не используете Ориентацию в другом месте вашего кода, вам нужна только вторая строка.