大家好,欢迎来到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