Main Content

imgradient

找到二维图像的梯度幅值和方向

说明

[Gmag,Gdir] = imgradient(I) 返回二维灰度图像或二值图像 I 的梯度幅值 Gmag 和梯度方向 Gdir

[Gmag,Gdir] = imgradient(I,method) 使用指定的 method 返回梯度幅值和方向。

示例

[Gmag,Gdir] = imgradient(Gx,Gy) 分别从 xy 方向的定向梯度 GxGy 返回梯度幅值和方向。

示例

示例

全部折叠

将图像读入工作区。

I = imread("coins.png");

计算梯度幅值和方向,指定普瑞维特梯度算子。

[Gmag,Gdir] = imgradient(I,"prewitt");

显示梯度幅值和方向。

imshowpair(Gmag,Gdir,"montage");
title("Gradient Magnitude (Left) and Gradient Direction (Right) Using Prewitt Method")

Figure contains an axes object. The hidden axes object with title Gradient Magnitude (Left) and Gradient Direction (Right) Using Prewitt Method contains an object of type image.

将图像读入工作区。

I = imread('coins.png');

计算 xy- 定向梯度。默认情况下,imgradientxy 使用索贝尔梯度算子。

[Gx,Gy] = imgradientxy(I);

显示定向梯度。

imshowpair(Gx,Gy,'montage')
title('Directional Gradients Gx and Gy, Using Sobel Method')

Figure contains an axes object. The hidden axes object with title Directional Gradients Gx and Gy, Using Sobel Method contains an object of type image.

使用定向梯度计算梯度幅值和方向。

[Gmag,Gdir] = imgradient(Gx,Gy);

显示梯度幅值和方向。

imshowpair(Gmag,Gdir,'montage')
title('Gradient Magnitude (Left) and Gradient Direction (Right)')

Figure contains an axes object. The hidden axes object with title Gradient Magnitude (Left) and Gradient Direction (Right) contains an object of type image.

输入参数

全部折叠

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

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

梯度算子,指定为下列值之一。

方法描述
"sobel"

索贝尔梯度算子。像素的梯度是 3×3 邻域内像素的加权和。对于垂直 (y) 方向的梯度,权重为:

[ 1  2  1 
  0  0  0 
 -1 -2 -1 ]
x 方向,权重被转置。

"prewitt"

普瑞维特梯度算子。像素的梯度是 3×3 邻域内像素的加权和。对于垂直 (y) 方向的梯度,权重为:

[ 1  1  1 
  0  0  0 
 -1 -1 -1 ]
x 方向,权重被转置。

"central"

中心差分梯度。一个像素的梯度是相邻像素的加权差。在 y 方向为 dI/dy = (I(y+1) - I(y-1))/2

"intermediate"

中间差分梯度。一个像素的梯度是相邻像素和当前像素之间的差。在 y 方向为 dI/dy = I(y+1) - I(y)

"roberts"

罗伯茨梯度算子。一个像素的梯度是对角相邻像素之间的差。对于一个方向的梯度,权重为:

[ 1  0 
  0 -1 ]
在正交方向,权重沿垂直轴翻转。

数据类型: char | string

水平梯度,指定为数值矩阵。水平 (x) 轴指向列下标递增的方向。您可以使用 imgradientxy 函数来计算 Gx

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

垂直梯度,指定为与 Gx 大小相同的数值矩阵。垂直 (y) 轴指向行下标递增的方向。您可以使用 imgradientxy 函数来计算 Gy

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

输出参量

全部折叠

梯度幅值,以数值矩阵形式返回,其大小与图像 I 或定向梯度 GxGy 相同。Gmag 的类默认为 double,除非输入图像或定向梯度的数据类型为 single,在这种情况下,它的数据类型为 single

数据类型: double | single

梯度方向,以数值矩阵形式返回,其大小与梯度幅值 Gmag 相同。Gdir 包含与正 x 轴的 [-180, 180] 范围内的逆时针夹角,以度为单位。(x 轴指向列下标递增的方向。)Gdir 属于 double 类,除非输入图像 I 或定向梯度属于 single 数据类型,在这种情况下,它属于 single 数据类型。

数据类型: double | single

提示

  • 当在图像边界应用梯度算子时,图像边界之外的值假定为等于最邻近的图像边界值。这类似于 imfilter 中的 "replicate" 边界选项。

算法

对于所列的每种梯度法,imgradient 中采用的算法是先分别计算 xy 方向的定向梯度 GxGy。水平 (x) 轴指向列下标递增的方向。垂直 (y) 轴指向行下标递增的方向。然后基于梯度的正交分量 GxGy 计算梯度幅值和方向。

imgradient 不会对梯度输出进行归一化。如果梯度输出图像的范围必须与输入图像的范围匹配,请考虑对梯度图像进行归一化,具体取决于所使用的 method 参量。例如,对于索贝尔核,归一化因子是 1/8,对于普瑞维特是 1/6,对于罗伯茨是 1/2。

扩展功能

版本历史记录

在 R2012b 中推出

全部展开