使用 MATLAB 中的一阶导数算子进行边缘检测

matlabdata analysisprogramming

在数字图像处理中,边缘检测是用于识别数字图像中对象边界的过程。我们有各种图像处理技术来检测图像中的边缘,但在本教程中,我们将学习使用 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 中的示例程序解释了使用一阶导数运算符进行边缘检测的过程。您可以使用自己的图像尝试所有这些代码。


相关文章