M 语言

# 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 方法生效)形式返回。