我试图理解非最大抑制(Canny边缘检测)的概念,所以我开始看matlab代码。确定边缘方向的部分matlab代码如下所示。
switch direction
case 1
idx = find((iy<=0 & ix>-iy) | (iy>=0 & ix<-iy));
case 2
idx = find((ix>0 & -iy>=ix) | (ix<0 & -iy<=ix));
case 3
idx = find((ix<=0 & ix>iy) | (ix>=0 & ix<iy));
case 4
idx = find((iy<0 & ix<=iy) | (iy>0 & ix>=iy));
end
,
- ix:沿x 进行高斯导数滤波的输入图像
- y:沿y 高斯导数滤波后的输入图像
- 情形1:0-45度或181-225度
- 案例2:46-90度或226-270度
- 案例3:91-135度或271-315度
- 案例4:136-180度或316-360度
开关箱内的情况如何与代码下面解释的情况相对应?有人能解释一下吗?div ?
乍一看,find((iy<=0 & ix>-iy) | (iy>=0 & ix<-iy));
返回
-
(iy<=0 & ix>-iy)
,所以- y导数小于零,因此边缘向下,在90°到270°之间
- x导数大于零,因此边缘向左,在180°和360°之间
- ix的大小大于iy,因此边缘主要是垂直倾斜,而不是水平倾斜
- 导致180°和225°之间的边缘
- 或
(iy>=0 & ix<-iy))
,所以- y导数大于零,因此边缘向上,在270°到90°之间
- x导数小于零,因此边缘向右,在0°和180°之间
- x的大小大于y,因此边缘垂直倾斜
- 产生0°和45°之间的边缘
假设像素从上到下,从左到右排序,并且定义一个完全垂直的边缘(左边是黑色,右边是白色)为0°
开关情况的其他三项是类似的。
这与非最大抑制没有直接关系。我假设这是一个精明的边缘滤波器或类似的东西的一部分,在这种情况下,下一步将是在刚刚确定的边缘方向上找到局部最大值。这是通过在边缘方向上比较每个像素与其局部相邻像素,并擦除除最大值外的所有像素来完成的。