Main Content

edge

查找强度图像的边缘

说明

BW = edge(I) 返回二值图像 BW,其中的值 1 对应于灰度或二值图像 I 中函数找到边缘的位置,值 0 对应于其他位置。默认情况下,edge 使用 Sobel 边缘检测方法。

示例

BW = edge(I,method) 使用 method 指定的边缘检测算法检测图像 I 中的边缘。

BW = edge(I,method,threshold) 返回强度高于 threshold 的所有边缘。

BW = edge(I,method,threshold,direction) 指定要检测的边缘的方向。Sobel 和 Prewitt 方法可以检测垂直方向和/或水平方向的边缘。Roberts 方法可以检测与水平方向成 45 度角和/或 135 度角的边缘。仅当 method'Sobel''Prewitt''Roberts' 时,此语法才有效。

BW = edge(___,'nothinning') 跳过边缘细化阶段,这可以提高性能。仅当 method'Sobel''Prewitt''Roberts' 时,此语法才有效。

BW = edge(I,method,threshold,sigma) 指定 sigma,即滤波器的标准差。仅当 method'log''Canny' 时,此语法才有效。

BW = edge(I,method,threshold,h) 使用 'zerocross' 方法和您指定的滤波器 h 检测边缘。仅当 method'zerocross' 时,此语法才有效。

[BW,threshOut] = edge(___) 还返回阈值。

[BW,threshOut,Gv,Gh] = edge(___) 还返回定向梯度幅值。对于 Sobel 和 Prewitt 方法,GvGh 对应于垂直和水平梯度。对于 Roberts 方法,GvGh 分别对应于与水平方向成 45° 和 135° 角的梯度。仅当 method'Sobel''Prewitt''Roberts' 时,此语法才有效。

示例

全部折叠

将灰度图像读入工作区并显示它。

I = imread('circuit.tif');
imshow(I)

使用 Canny 方法查找边缘。

BW1 = edge(I,'Canny');

使用 Prewitt 方法查找边缘。

BW2 = edge(I,'Prewitt');

将两个结果并排显示。

imshowpair(BW1,BW2,'montage')

输入参数

全部折叠

输入图像,指定为二维灰度图像或二维二值图像。

对于 'approxcanny' 方法,数据类型为 singledouble 的图像必须归一化至范围 [0, 1]。如果 I 的值超出范围 [0, 1],则可以使用 rescale 函数将值重新缩放到预期范围。

数据类型: double | single | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | logical

边缘检测方法,指定为下列方法之一。

方法说明
'Sobel'

使用导数的 Sobel 逼近,通过寻找图像 I 的梯度最大的那些点来查找边缘。

'Prewitt'

使用导数的 Prewitt 逼近,通过寻找 I 的梯度最大的那些点来查找边缘。

'Roberts'使用导数的 Roberts 逼近,通过寻找 I 的梯度最大的那些点来查找边缘。
'log'使用高斯拉普拉斯 (LoG) 滤波器对 I 进行滤波后,通过寻找过零点来查找边缘。
'zerocross'使用您指定的滤波器 hI 进行滤波后,通过寻找过零点来查找边缘
'Canny'

通过寻找 I 的梯度的局部最大值来查找边缘。edge 函数使用高斯滤波器的导数计算梯度。此方法使用双阈值来检测强边缘和弱边缘,如果弱边缘与强边缘连通,则将弱边缘包含到输出中。通过使用双阈值,Canny 方法相对其他方法不易受噪声干扰,更可能检测到真正的弱边缘。

'approxcanny'

使用近似版 Canny 边缘检测算法查找边缘,该算法的执行速度较快,但检测不太精确。浮点图像应归一化到范围 [0, 1]。

敏感度阈值,指定为数值标量(对于一般 method)或二元素向量(对于 'Canny''approxcanny' 方法)。edge 忽略所有强度不大于 threshold 的边缘。有关此参数的详细信息,请参阅算法

  • 如果不指定 threshold 或指定空数组 ([]),则 edge 会自动选择一个或多个值。

  • 对于 'log''zerocross' 方法,如果您指定阈值 0,则输出图像具有闭合轮廓,因为它包括输入图像中的所有过零点。

  • 'Canny''approxcanny' 方法使用两个阈值。edge 忽略边缘强度低于下阈值的所有边缘,保留边缘强度高于上阈值的所有边缘。您可以将 threshold 指定为 [low high] 形式的二元素向量,其中 lowhigh 值在范围 [0 1] 内。您还可以将 threshold 指定为数值标量,edge 将其分配给上阈值。在这种情况下,edge 使用 threshold*0.4 作为下阈值。

数据类型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

要检测的边缘的方向,指定为 'horizontal''vertical''both'。仅当 method'Sobel''Prewitt''Roberts' 时,direction 参数才有效。

注意

如果您选择 Roberts method,则 'horizontal' 方向实际上检测到与水平方向成 135° 角的边缘,'vertical' 方向检测到与水平方向成 45° 角的边缘。

数据类型: char | string

滤波器,指定为数值矩阵。仅 'zerocross' 方法支持 h 参数。

数据类型: double

滤波器的标准差,指定为数值标量。仅 'Canny''log' 方法支持 sigma 参数。

方法说明
'Canny'

标量值,指定高斯滤波器标准差。默认值为 sqrt(2)edge 根据 sigma 自动选择滤波器的大小。

'log'(高斯拉普拉斯)

标量值,指定高斯拉普拉斯滤波器标准差。默认值为 2。滤波器的大小为 n×n,其中 n=ceil(sigma*3)*2+1

数据类型: double

输出参数

全部折叠

输出二值图像,以与 I 大小相同的逻辑数组形式返回,值 1 对应于 I 中函数找到边缘的位置,值 0 对应于其他位置。

在运算中使用的计算的阈值,以二元素向量形式(对于 'Canny' 方法)、空向量 ([]) 形式(对于 'approxcanny' 方法)或数值标量形式(对于所有其他边缘检测方法)返回。

垂直梯度,以与 I 大小相同的数值数组形式返回。

注意

如果您选择 Roberts method,则 edge 将返回与水平方向成 45° 角计算的梯度。

水平梯度,以与 I 大小相同的数值数组形式返回。

注意

如果您选择 Roberts method,则 edge 将返回与水平方向成 135° 角计算的梯度。

算法

  • 对于梯度幅值边缘检测方法(Sobel、Prewitt 和 Roberts),edge 使用 threshold 作为计算所得梯度幅值的阈值。

  • 对于过零方法,包括高斯拉普拉斯,edge 使用 threshold 作为过零的阈值。换言之,较大的过零跳跃被视为边缘,而较小的过零跳跃不是。

  • Canny 方法对梯度应用两个阈值:具有低边缘敏感度的上阈值和具有高边缘敏感度的下阈值。edge 在低敏感度结果的基础上进行扩展,以包含高敏感度结果中连通的边缘像素。这有助于填补检测到的边缘中的间断。

  • 在所有情况下,edge 都根据输入数据启发式地选择默认阈值。更改阈值的最佳方法是运行一次 edge,捕获计算出的阈值作为第二个输出参数。然后,从 edge 计算的值开始,调高阈值以检测更少的边缘像素,或调低阈值以检测更多的边缘像素。

兼容性注意事项

全部展开

R2011a 中的行为有变化

参考

[1] Canny, John, "A Computational Approach to Edge Detection," IEEE Transactions on Pattern Analysis and Machine Intelligence, Vol. PAMI-8, No. 6, 1986, pp. 679-698.

[2] Lim, Jae S., Two-Dimensional Signal and Image Processing, Englewood Cliffs, NJ, Prentice Hall, 1990, pp. 478-488.

[3] Parker, James R., Algorithms for Image Processing and Computer Vision, New York, John Wiley & Sons, Inc., 1997, pp. 23-29.

扩展功能

在 R2006a 之前推出