# edge
查找二维灰度图像中的边缘
# 语法
BW = edge(I;figure = false)
BW = edge(I,method;figure = false)
BW = edge(I,method;threshold,figure = false)
BW = edge(I,method;threshold,direction,figure = false)
BW = edge(I,method,threshold,sigma,figure = false)
BW,thOut = edge(I,"Canny";threshold=nothing,sigma=sqrt(2),figure=false)
# 用法示例
BW,threshOut = edge(I,"Canny";fig = false,threshold=[0.1 0.3],sigma=1.3)
edge(I,"Canny";fig = true,threshold=[0.1 0.3],sigma=1.3)
BW = edge(I,"Prewitt";fig = false,direction="both")
edge(I,"Prewitt";fig = true,direction="both")
BW = edge(I,"Sobel";fig = false,direction="both")
edge(I,"Sobel";fig = true,direction="both")
BW = edge(I,"Roberts";fig = false,direction="both")
edge(I,"Roberts";fig = true,direction="both")
BW = edge(I,"log";fig = false)
edge(I,"log";fig = true)
BW = edge(I,"zerocross";fig = false)
edge(I,"zerocross";fig = true)
# 说明
BW = edge(I;fig = false) 返回二值图像 BW,其中的值 1 对应于灰度或二值图像 I 中函数找到边缘的位置,值 0 对应于其他位置。默认情况下,edge 使用索贝尔边缘检测方法。关键字 fig 为 Bool 变量,当 fig 为 true 时,自动绘图,否则,返回变量 BW。
BW = edge(I,method;fig) 使用 method 指定的边缘检测算法检测图像 I 中的边缘。示例
BW = edge(I,method;fig,threshold) 返回强度高于 threshold 的所有边缘。
BW = edge(I,method;fig,threshold,direction) 指定要检测的边缘的方向。索贝尔和普瑞维特方法可以检测垂直方向和/或水平方向的边缘。罗伯茨方法可以检测与水平方向成 45 度角和/或 135 度角的边缘。仅当 method 是 "Sobel"、"Prewitt" 或 "Roberts" 时,此语法才有效。
BW = edge(I,method;fig,threshold,sigma) 指定 sigma,即滤波器的标准差。仅当 method 是 "Canny" 时,此语法才有效。
BW,threshOut = edge(___;fig=false) 还返回阈值。
# 示例
比较使用坎尼和普瑞维特方法的边缘检测结果
将灰度图像读入工作区并显示它。
I = imread("circuit.tif");
imshow(I)
使用坎尼方法查找边缘。
BW1 = edge(I,'Canny');
使用普瑞维特方法查找边缘。
BW2 = edge(I,'Prewitt');
将两个结果并排显示。
imshowpair(BW1,BW2,'montage')

# 输入参数
I - 输入图像二维灰度图像 | 二维二值图像
输入图像,指定为二维灰度图像或二维二值图像。
数据类型: uint8 | uint16 | int16 | single | double | logical
method - 边缘检测方法"Sobel" (默认) | "Prewitt" | "Roberts" | "log" | "zerocross" | "Canny"
边缘检测方法,指定为下列方法之一。
| 方法 | 描述 |
|---|---|
| "Sobel" | 使用导数的 Sobel 逼近,通过寻找图像 I 的梯度最大的那些点来查找边缘。 |
| "Prewitt" | 使用导数的 Prewitt 逼近,通过寻找 I 的梯度最大的那些点来查找边缘。 |
| "Roberts" | 使用导数的 Roberts 逼近,通过寻找 I 的梯度最大的那些点来查找边缘。 |
| "log" | 使用高斯拉普拉斯 (LoG) 滤波器对 I 进行滤波后,通过寻找过零点来查找边缘。 |
| "zerocross" | 使用您指定的滤波器 h 对 I 进行滤波后,通过寻找过零点来查找边缘。 |
| "Canny" | 通过寻找 I 的梯度的局部最大值来查找边缘。edge 函数使用高斯滤波器的导数计算梯度。此方法使用双阈值来检测强边缘和弱边缘,如果弱边缘与强边缘连通,则将弱边缘包含到输出中。通过使用双阈值,Canny 方法相对其他方法不易受噪声干扰,更可能检测到真正的弱边缘。 |
threshold - 敏感度阈值数值标量 | 二元素向量
敏感度阈值,指定为数值标量(对于一般 method)或二元素向量(对于 "Canny" 方法)。edge 忽略所有强度不大于 threshold 的边缘。
如果不指定 threshold 或指定空数组 ([]),则 edge 会自动选择一个或多个值;
对于 "log" 和 "zerocross" 方法,如果您指定阈值 0,则输出图像具有闭合轮廓,因为它包括输入图像中的所有过零点;
"Canny" 方法使用两个阈值。edge 忽略边缘强度低于下阈值的所有边缘,保留边缘强度高于上阈值的所有边缘。您可以将 threshold 指定为 [low high] 形式的二元素向量,其中 low 和 high 值在范围 [0, 1] 内。您还可以将 threshold 指定为数值标量,edge 将其分配给上阈值。在这种情况下,edge 使用 threshold*0.4 作为下阈值。
数据类型: double
direction - 要检测的边缘的方向"both" (默认) | "horizontal" | "vertical"
要检测的边缘的方向,指定为 "horizontal"、"vertical" 或 "both"。仅当 method 是 "Sobel"、"Prewitt" 或 "Roberts" 时,direction 参数才有效。
数据类型: char | string
sigma - 滤波器的标准差数值标量
滤波器的标准差,指定为数值标量。仅 "Canny" 和 "log" 方法支持 sigma 参数。
| 方法 | 描述 |
|---|---|
| "Canny" | 标量值,指定高斯滤波器标准差。默认值为 sqrt(2)。edge 根据 sigma 自动选择滤波器的大小。 |
| "log"(高斯拉普拉斯) | 标量值,指定高斯拉普拉斯滤波器标准差。默认值为 2。滤波器的大小为 n×n,其中 n=ceil(sigma*3)*2+1。 |
数据类型: double
# 输出参数
BW - 输出二值图像数值数组
输出二值图像,以与 I 大小相同的 UInt8 形式返回,值 1 对应于 I 中函数找到边缘的位置,值 0 对应于其他位置。
threshOut - 计算的阈值二元素向量
在运算中使用的计算的阈值,以二元素向量形式(仅对于 "Canny" method 方法生效)形式返回。