当我尝试在 matlab 中执行非最大抑制时,图像是一条线
Posted
技术标签:
【中文标题】当我尝试在 matlab 中执行非最大抑制时,图像是一条线【英文标题】:Image is a line when I try to perform non maximal suppression in matlab 【发布时间】:2016-10-17 17:55:06 【问题描述】:所以,我在 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
【问题讨论】:
我编辑了我的答案,为您添加了 1/2 行解决方案 【参考方案1】:希望我能理解,但您可以使用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
需要图像处理工具箱
【讨论】:
【参考方案2】:在代码的上半部分,您在 0 到 3*pi/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
如果您没有在代码的其他地方使用orientationdis,则只需要第二行。
【讨论】:
我这样做是因为我认为 0 覆盖 180、45 覆盖 -135 和 90 覆盖 -90以上是关于当我尝试在 matlab 中执行非最大抑制时,图像是一条线的主要内容,如果未能解决你的问题,请参考以下文章