使用 MATLAB 中的一阶导数算子进行边缘检测
在数字图像处理中,边缘检测是用于识别数字图像中对象边界的过程。我们有各种图像处理技术来检测图像中的边缘,但在本教程中,我们将学习使用 MATLAB 中的一阶导数算子进行边缘检测。
什么是 MATLAB 中的边缘检测?
MATLAB 是一种执行复杂图像处理任务的有效工具。其中一项任务是边缘检测,它只不过是检测图像中对象边界的过程。
在图像中,对象的边缘通常是发生突然强度变化的区域。
边缘检测是一个至关重要的过程,因为它在各种工程和技术领域发挥着至关重要的作用,例如图像分割、特征提取、图像质量增强、自动驾驶汽车和机器人技术等等。
现在,让我们讨论一下在 MATLAB 中使用一阶导数运算符进行边缘检测的过程。
在 MATLAB 中使用一阶导数运算符进行边缘检测
在 MATLAB 中,我们可以按照以下步骤使用一阶导数运算符执行边缘检测:
步骤 (1) - 使用"imread"函数读取输入图像。为此,请使用以下语法:
img = imread('Image.jpg');
步骤 (2) - 将输入图像转换为灰度,以便使用 MATLAB 等数字工具进行处理。为此,请使用"rgb2gray"函数。
gray_img = rgb2gray(img);
步骤 (3) - 将灰度图像转换为双精度进行计算。按如下方式执行:
gray_img = double(gray_img);
步骤 (4) - 定义一阶导数运算符"D"以执行边缘检测。它可以是"前向运算符"、"中心运算符"或"后向运算符"。
步骤 (5) - 将图像与一阶导数运算符进行卷积,以检测图像内物体的边缘。为此,请使用"conv2"函数,如下所示:
edge_img = conv2(gray_img, D);
步骤 (6) - 调整边缘检测图像,使其适合可视化。为此,您可以使用"abs"函数对卷积图像取绝对值,然后将生成的图像转换为 8 位无符号整数格式以显示。请按如下方式执行此操作:
edge_img = abs(edge_img); edge_img = uint8(edge_img);
步骤 (7) − 最后,使用'imshow'函数显示结果的边缘检测图像,如下所示:
imshow(edge_img);
现在,让我们考虑 MATLAB 中的一些示例程序,以实际了解如何使用一阶导数运算符执行边缘检测。
示例 (1) − 使用前向运算符进行边缘检测
% 使用一阶导数前向算子执行边缘检测的 MATLAB 代码 % 读取输入图像 img = imread('https://www.tutorialspoint.com/assets/questions/media/14304-1687425236.jpg'); % 将输入图像转换为灰度以进行处理 gray_img = rgb2gray(img); % 将灰度图像转换为双精度数据类型以进行计算 gray_img = double(gray_img); % 创建一阶导数算子 D = [1 -1 0]; % 前向算子 % 使用前向算子对图像进行卷积以检测边缘 Cx = conv2(gray_img, D, 'same'); % 沿 x 轴卷积 Cy = conv2(gray_img, D, 'same'); %沿 y 轴卷积 % 计算边缘幅度(边缘图像) edge_img = sqrt(Cx.^2 + Cy.^2); % 显示原始图像和边缘检测图像 figure; subplot(2, 1, 1); imshow(img); title('原始图像'); subplot(2, 1, 2); imshow(edge_img, []); title('边缘图像');
输出
它将生成以下输出图像:

代码说明
在此 MATLAB 代码中,我们首先使用"imread"函数读取输入图像。然后,我们将输入图像从 RGB 颜色级转换为灰度级进行处理,并将其转换为双精度数据类型进行计算。
之后,定义前向一阶导数算子"D",并使用"conv2"函数沿 x 轴和 y 轴将灰度图像与该算子进行卷积以检测边缘。之后,我们计算边缘幅度以获得完整的边缘检测图像。
最后,我们使用"imshow"函数显示原始图像和边缘检测图像。
示例 (2) - 使用中心算子进行边缘检测
% 使用一阶导数中心算子执行边缘检测的 MATLAB 代码 % 读取输入图像 img = imread('https://www.tutorialspoint.com/assets/questions/media/14304-1687425236.jpg'); % 将输入图像转换为灰度以进行处理 gray_img = rgb2gray(img); % 将灰度图像转换为双精度数据类型以进行计算 gray_img = double(gray_img); % 创建一阶导数算子 D = [1 0 -1]; % 中心算子 % 使用前向算子对图像进行卷积以检测边缘 Cx = conv2(gray_img, D, 'same'); % 沿 x 轴卷积 Cy = conv2(gray_img, D, 'same'); %沿 y 轴卷积 % 计算边缘幅度(边缘图像) edge_img = sqrt(Cx.^2 + Cy.^2); % 显示原始图像和边缘检测图像 figure; subplot(2, 1, 1); imshow(img); title('原始图像'); subplot(2, 1, 2); imshow(edge_img, []); title('边缘图像');
输出
它将生成以下输出图像:

代码说明:此 MATLAB 代码的实现和执行与上一个相同。唯一的区别是,这里的边缘检测是用一阶导数中心算子完成的。
示例 (3) - 使用后向算子进行边缘检测
% 读取输入图像 img = imread('https://www.tutorialspoint.com/assets/questions/media/14304-1687425236.jpg'); % 将输入图像转换为灰度以进行处理 gray_img = rgb2gray(img); % 将灰度图像转换为双精度数据类型以进行计算 gray_img = double(gray_img); % 创建一阶导数算子 D = [0 1 -1]; % 后向算子 % 使用前向算子对图像进行卷积以检测边缘 Cx = conv2(gray_img, D, 'same'); % 沿 x 轴卷积 Cy = conv2(gray_img, D, 'same'); %沿 y 轴卷积 % 计算边缘幅度(边缘图像) edge_img = sqrt(Cx.^2 + Cy.^2); % 显示原始图像和边缘检测图像 figure; subplot(2, 1, 1); imshow(img); title('原始图像'); subplot(2, 1, 2); imshow(edge_img, []); title('边缘图像');
输出
它将生成以下输出图像:

代码说明:此 MATLAB 代码的实现和执行与前两个相同。唯一的区别是这里使用一阶导数后向运算符执行边缘检测。
结论
总之,边缘检测是突出显示图像中对象边界的过程。MATLAB 可用于执行边缘检测。在本教程中,我借助 MATLAB 中的示例程序解释了使用一阶导数运算符进行边缘检测的过程。您可以使用自己的图像尝试所有这些代码。