canny算法(3)——非极大值抑制

canny算法(3)——非极大值抑制canny算法(1)——高斯平滑滤波高斯平滑滤波是一种线性滤波,用于消除高斯噪声,广泛用于图像处理的减噪。高斯滤波就是对整幅图像进行加权平均,每一个像素的值都是由其本身和邻域内的其它像素值经过加权平均后得到的。这里需要一个模板,即高斯核的计算,上一篇文章详细计算过(高斯核的计算)。高斯滤波的计算公式如下:f(x)=1σ2πe−(x−μ)22σ@f(x)=\frac{1}{\sigma\sqr…

大家好,欢迎来到IT知识分享网。

数学概念

顾名思义就是抑制不是极大值的元素,可以理解为局部最大搜索。这个局部代表的是一个邻域,邻域有两个参数可变,一是邻域的维数,二是邻域的大小。

近似划分

由于由梯度计算出来的图像边缘是很模糊的,对于存在很多个边缘梯度响应的现象。我们力求在一个梯度方向上找到一个局部的最大值来表示该梯度方向上的梯度响应。在平面360范围内然后把它近似到四个方向,分别代表水平,垂直和两个对角线方向(0°,45°,90°,135°),每个区域的梯度角给一个特定值,代表四个方向之一,如下图所示
在这里插入图片描述
优点

这样做的好处是便于计算,便于理解,把在每一个区域内的梯度方向全部近似为一个梯度方向,在这近似的一个梯度方向前后寻求最大值。

缺点

没有插值处理,计算的每一个点的梯度在它的8邻域的梯度方向并不是你所 划分的梯度方向,所处的像素点不是整像素,是小数。

具体代码

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%           非极大值抑制角度划分                 %%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
%将角度划分为四个角度:0°、-45°、90°、+45° ,规定逆时针为正,        
for i = 1:row
    for j = 1:col
        if((a(i,j) >= -22.5) &&  (a(i,j) < 22.5) || (a(i,j) <= -157.5) && (a(i,j) >= -180)||(a(i,j) >= 157.5)&&(a(i,j) <= 180))
            a(i,j) = 0;
        elseif((a(i,j) >= 22.5) && (a(i,j) < 67.5) || (a(i,j) <= -112.5) && (a(i,j) > -157.5))
            a(i,j) = -45;
        elseif((a(i,j) >= 67.5) && (a(i,j) < 112.5) || (a(i,j) <= -67.5) && (a(i,j) >- 112.5))
            a(i,j) = 90;
        elseif((a(i,j) >= 112.5) && (a(i,j) < 157.5) || (a(i,j) <= -22.5) && (a(i,j) > -67.5))
            a(i,j) = 45;  
        end
    end
end      
%3x3区域的四个边缘方向进行非极大值抑制,没有插值,获取非极大值抑制图像
jd = zeros(row,col);%定义一个非极大值图像
for i = 2:row-1
    for j= 2:col-1
        if (a(i,j) == 0 && M(i,j) == max([M(i,j), M(i,j+1), M(i,j-1)]))
            jd(i,j) = M(i,j);
        elseif (a(i,j) == -45 && M(i,j) == max([M(i,j), M(i+1,j-1), M(i-1,j+1)]))
            jd(i,j) = M(i,j);
        elseif (a(i,j) == 90 && M(i,j) == max([M(i,j), M(i+1,j), M(i-1,j)]))
            jd(i,j) = M(i,j);
        elseif (a(i,j) == 45 && M(i,j) == max([M(i,j), M(i+1,j+1), M(i-1,j-1)]))
            jd(i,j) = M(i,j);
        end
    end
end
subplot(2,3,4)
imshow(jd)%输出用prewitt模板处理后的梯度幅值图片
title('非极大值抑制后的图像')

插值处理

现在我们可以在划分好的梯度方向上寻求局部梯度最大值,将当前像素的梯度强度与沿正负梯度方向上的两个像素进行比较。如果当前像素的梯度强度与另外两个像素相比最大,则该像素点保留为边缘点,否则该像素点将被抑制。但是当出现最大值梯度方向不在整像素,而是亚像素,通常为了更加精确的计算,在跨越梯度方向的两个相邻像素之间使用线性插值来得到要比较的像素梯度,如下图蓝线所示情况:
在这里插入图片描述
优点
这样做的好处计算更精确,避免了大量的近似估计。
缺点
运算速度慢,计算不太方便,不过插值处理效果比近似划分好多了
具体代码

%%           非极大值抑制插值处理            %%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
jd = zeros(row,col);%定义一个非极大值图像
for i = 2:row-1
    for j = 2:col-1
        if abs(gy(i,j))>abs(gx(i,j)) 
            weight=gx(i,j)./gy(i,j);
            g2=M(i+1,j);
            g4=M(i-1,j);
            %g1 g2
            %    c
            %    g4 g3
            if gy(i,j)*gx(i,j)>0
                g1=M(i+1,j-1);
                g3=M(i-1,j+1);
            %    g2 g1
            %    c
            %g3 g4
            elseif gy(i,j)*gx(i,j)<0
                g1=M(i+1,j+1);
                g3=M(i-1,j-1);
            end
        else 
            weight=gy(i,j)./gx(i,j);
            g2=M(i,j-1);
            g4=M(i,j+1);
            %      g3
            %g2  c g4
            %g1
            if gy(i,j)*gx(i,j)>0
                g1=M(i-1,j-1);
                g3=M(i+1,j+1);
            %g1  
            %g2  c   g4
            %        g3
            elseif gy(i,j)*gx(i,j)<0
                g1=M(i+1,j-1);
                g3=M(i-1,j+1);
            end
        end
        dTemp1 = weight*g1 + (1-weight)*g2;
		dTemp2 = weight*g3 + (1-weight)*g4;
        if M(i,j)>=dTemp1 && M(i,j)>=dTemp2	
			jd(i,j) =M(i,j);
        end
    end
end      
subplot(1,2,2)
imshow(jd)
title('插值处理非极大值抑制后的图像')c

效果图如下

整体效果图
整体效果图

两种极大值抑制方法对比效果图
对比效果图

到此为止,canny算法的第三步,图像梯度的极大值抑制就算告一段落了,希望各位学友批评指正,如有问题,或需要探讨,请留言或联系本人。请留言或联系本人。 Q Q : 2214564003 QQ:2214564003 QQ:2214564003
欢迎关注本人微信公众号:
在这里插入图片描述

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/21903.html

(0)

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

关注微信