当我尝试在matlab中执行非最大抑制时,图像是一条线

时间:2016-10-17 17:55:06

标签: matlab canny-operator

所以,我在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 个答案:

答案 0 :(得分:0)

在代码的顶部,您以弧度为单位在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,则只需要第二行。

答案 1 :(得分:0)

我希望我理解,但您可以使用(second=true)来应用滑动邻居操作。

例如,你可以这样做:

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; 需要图片处理工具箱