说明

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,Gv,Gh] = edge(___)还返回定向梯度幅值。对于 Sobel 和Prewitt 方法,Gv和Gh对应于垂直和水平梯度。对于 Roberts 方法,Gv和Gh分别对应于与水平方向成 45° 和135° 角的梯度。仅当method是'Sobel'、'Prewitt'或'Roberts'时,此语法才有效。

示例

比较使用 Canny 和Prewitt 方法的边缘检测结果

将灰度图像读入工作区并显示它。
I = imread('circuit.tif'); imshow(I)
使用 Canny 方法查找边缘。
BW1 = edge(I,'Canny');
使用 Prewitt 方法查找边缘。
BW2 = edge(I,'Prewitt');
将两个结果并排显示。
imshowpair(BW1,BW2,'montage')

输入参数

I-输入图像

二维灰度图像 |二维二值图像

输入图像,指定为二维灰度图像或二维二值图像。
对于'approxcanny'方法,数据类型为single或double的图像必须归一化至范围 [0, 1]。如果I的值超出范围 [0, 1],则可以使用rescale函数将值重新缩放到预期范围。
数据类型:double|single|int8|int16|int32|int64|uint8|uint16|uint32|uint64|logical

method-边缘检测方法

'Sobel'(默认) |'Prewitt'|'Roberts'|'log'|'zerocross'|'Canny'|'approxcanny'

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

方法说明
'Sobel'
使用导数的 Sobel 逼近,通过寻找图像I的梯度最大的那些点来查找边缘。
'Prewitt'
使用导数的 Prewitt 逼近,通过寻找I的梯度最大的那些点来查找边缘。
'Roberts'使用导数的 Roberts 逼近,通过寻找I的梯度最大的那些点来查找边缘。
'log'使用高斯拉普拉斯 (LoG) 滤波器对I进行滤波后,通过寻找过零点来查找边缘。
'zerocross'使用您指定的滤波器h对I进行滤波后,通过寻找过零点来查找边缘
'Canny'
通过寻找I的梯度的局部最大值来查找边缘。edge函数使用高斯滤波器的导数计算梯度。此方法使用双阈值来检测强边缘和弱边缘,如果弱边缘与强边缘连通,则将弱边缘包含到输出中。通过使用双阈值,Canny 方法相对其他方法不易受噪声干扰,更可能检测到真正的弱边缘。
'approxcanny'
使用近似版 Canny 边缘检测算法查找边缘,该算法的执行速度较快,但检测不太精确。浮点图像应归一化到范围 [0, 1]。

threshold-敏感度阈值

数值标量 |二元素向量 |[]

敏感度阈值,指定为数值标量(对于一般method)或二元素向量(对于'Canny'和'approxcanny'方法)。edge忽略所有强度不大于threshold的边缘。有关此参数的详细信息,请参阅算法。
如果不指定threshold或指定空数组 ([]),则edge会自动选择一个或多个值。
对于'log'和'zerocross'方法,如果您指定阈值0,则输出图像具有闭合轮廓,因为它包括输入图像中的所有过零点。
'Canny'和'approxcanny'方法使用两个阈值。edge忽略边缘强度低于下阈值的所有边缘,保留边缘强度高于上阈值的所有边缘。您可以将threshold指定为[low high]形式的二元素向量,其中low和high值在范围 [0 1] 内。您还可以将threshold指定为数值标量,edge将其分配给上阈值。在这种情况下,edge使用threshold*0.4作为下阈值。
数据类型:single|double|int8|int16|int32|int64|uint8|uint16|uint32|uint64

direction-要检测的边缘的方向

'both'(默认) |'horizontal'|'vertical'

要检测的边缘的方向,指定为'horizontal'、'vertical'或'both'。仅当method是'Sobel'、'Prewitt'或'Roberts'时,direction参数才有效。
注意
如果您选择 Robertsmethod,则'horizontal'方向实际上检测到与水平方向成 135° 角的边缘,'vertical'方向检测到与水平方向成 45° 角的边缘。
数据类型:char|string

h-滤波器

数值矩阵

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

sigma-滤波器的标准差

数值标量

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

方法说明
'Canny'
标量值,指定高斯滤波器标准差。默认值为sqrt(2)。edge根据sigma自动选择滤波器的大小。
'log'(高斯拉普拉斯)
标量值,指定高斯拉普拉斯滤波器标准差。默认值为2。滤波器的大小为n×n,其中n=ceil(sigma*3)*2+1。

数据类型:double

输出参数

BW- 输出二值图像

逻辑数组

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

threshOut- 计算的阈值

数值标量 | 二元素向量 |[]

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

Gv- 垂直梯度

数值数组

垂直梯度,以与I大小相同的数值数组形式返回。
注意
如果您选择 Robertsmethod,则edge将返回与水平方向成 45° 角计算的梯度。

Gh- 水平梯度

数值数组

水平梯度,以与I大小相同的数值数组形式返回。
注意
如果您选择 Robertsmethod,则edge将返回与水平方向成 135° 角计算的梯度。

算法

对于梯度幅值边缘检测方法(Sobel、Prewitt 和Roberts),edge使用threshold作为计算所得梯度幅值的阈值。
对于过零方法,包括高斯拉普拉斯,edge使用threshold作为过零的阈值。换言之,较大的过零跳跃被视为边缘,而较小的过零跳跃不是。
Canny 方法对梯度应用两个阈值:具有低边缘敏感度的上阈值和具有高边缘敏感度的下阈值。edge在低敏感度结果的基础上进行扩展,以包含高敏感度结果中连通的边缘像素。这有助于填补检测到的边缘中的间断。
在所有情况下,edge都根据输入数据启发式地选择默认阈值。更改阈值的最佳方法是运行一次edge,捕获计算出的阈值作为第二个输出参数。然后,从edge计算的值开始,调高阈值以检测更少的边缘像素,或调低阈值以检测更多的边缘像素。

兼容性注意事项

edge对Canny 方法使用新算法

R2011a 中的行为有变化
函数edge在版本 7.2 (R2011a) 中已更改。在以前的版本中,Image Processing Toolbox™ 对Canny 方法使用另一种算法。如果您希望结果与以前的实现相同,请使用以下语法:BW = edge(I,'canny_old',___)

参考

[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.

扩展功能

C/C++ 代码生成

使用 MATLAB® Coder™ 生成 C 代码和 C++ 代码。

用法说明和限制:
edge支持 C 代码生成(需要MATLAB®Coder™)。请注意,如果您选择通用的MATLAB Host Computer目标平台,edge生成的代码将使用平台特定的预编译共享库。使用共享库可保留性能上的优化,但适用范围仅限于生成的代码所适用的目标平台。有关详细信息,请参阅使用共享库进行代码生成。
method、direction和sigma参数必须为编译时常量。
不支持Gv和Gh输出参数。

GPU 代码生成

使用 GPU Coder™ 为NVIDIA® GPU 生成 CUDA® 代码。

使用说明和限制:
method、direction和sigma参数必须为编译时常量。