三种常用边缘检测算法

1、Canny算法

2、Sobel算法

3、Prewitt算法

一、Canny算法

      Canny算法是一种经典的边缘检测算法,它在图像中寻找梯度的极大值来检测边缘,并通过非极大值抑制和双阈值处理来提高检测结果的准确性和稳定性。它通常能够较好地检测出图像中的边缘。Canny算法对噪声有较好的抑制效果。

      在实际应用中,可以根据具体场景和要求调整高斯平滑的标准差以及高低阈值的设定,以获得最佳的边缘检测结果。

实现的相应MATLAB代码如下:

% 读取输入图像
img = imread('ceshi.jpg');%更改自己的图像
figure;
imshow(img);
title('原始图像');

% 将图像转换为灰度图
gray_img = rgb2gray(img);
% imshow(gray_img)

% 应用高斯平滑以减少噪声
smooth_img = imgaussfilt(gray_img, 1); % 您可以调整标准差来控制平滑程度,标准差越大-高斯滤波器的宽度越大-平滑效果明显-信息模糊

% 执行Canny边缘检测
edges = edge(smooth_img, 'Canny');

% 显示边缘检测后的图像
%figure
imshow(edges);
title('边缘检测后的图像');

其运行结果如下:(左边是检测后的图像,右边是原图)

二、Sobel算法

Sobel算法是一种经典的图像边缘检测算法,用于在图像中检测边缘。它是基于一种离散的差分算子,通过计算图像像素灰度值的梯度来识别边缘。Sobel算子分为水平方向和垂直方向两个部分,分别用Sx和Sy表示。这两个算子都是3x3的矩阵,用于对图像进行卷积运算。但是对噪声比较明敏感。

具体的流程MATLAB代码如下:

% 读取输入图像
img = imread('ceshi.jpg');
imshow(img);
title('原始图像');

% 将图像转换为灰度图
gray_img = rgb2gray(img);

gray_img = imgaussfilt(gray_img, 1); 

% 应用Sobel算子进行边缘检测
edges_x = edge(gray_img, 'Sobel', 'horizontal'); % 水平方向边缘
edges_y = edge(gray_img, 'Sobel', 'vertical');   % 垂直方向边缘

% 合并水平和垂直边缘
edges = edges_x | edges_y;

% 显示边缘检测后的图像
figure;
imshow(edges);
title('Sobel边缘检测后的图像');

其运行结果如下(左边是检测后的图像,右边是原图):

三、Prewitt算法

Prewitt算法与Sobel算法类似,都是基于差分算子进行边缘检测。同时,该算法易受到噪声的影响。

具体的流程MATLAB代码如下:

% 读取输入图像
img = imread('ceshi.jpg');
%imshow(img);
%title('原始图像');

% 将图像转换为灰度图
gray_img = rgb2gray(img);
imshow(gray_img);

% 应用Prewitt算子进行边缘检测
prewitt_mask_x = [-1, 0, 1; -1, 0, 1; -1, 0, 1]; % 水平方向Prewitt算子
prewitt_mask_y = [-1, -1, -1; 0, 0, 0; 1, 1, 1]; % 垂直方向Prewitt算子

edges_x = conv2(double(gray_img), prewitt_mask_x, 'same');
edges_y = conv2(double(gray_img), prewitt_mask_y, 'same');

% 计算梯度幅值
edges = sqrt(edges_x.^2 + edges_y.^2);

% 边缘强度归一化到0~255
edges = uint8(edges ./ max(edges(:)) * 255);

% 显示边缘检测后的图像
figure;
imshow(edges);
title('Prewitt边缘检测后的图像');

其运行结果如下(左边是检测后的图像,右边是原图):

四、边缘检测的作用

在很多图像处理任务中,边缘检测是第一步,它的结果对后续的处理和分析起着至关重要的作用。例如:

  1. 物体检测:边缘检测可以帮助识别图像中物体的轮廓和形状,从而实现物体检测和分割。在目标检测任务中,边缘检测可以用于提取目标的边界,帮助识别和定位目标。

  2. 特征提取:边缘是图像中最重要的特征之一,它包含了图像中的纹理、形状和结构信息。通过边缘检测,可以提取出图像中的主要特征,用于图像分类、识别和匹配等任务。

  3. 图像增强:边缘检测可以用于图像增强,突出图像中物体的边缘和轮廓,使图像更加清晰和易于理解。

  4. 目标跟踪:在视频分析中,边缘检测可以用于目标的跟踪和运动分析,通过不断检测目标的边缘变化来实现目标的跟踪。

  5. 图像分割:边缘检测可以用于图像分割,将图像分成不同的区域和对象,从而方便进一步的图像分析和处理。

下面以图像增强为例,具体的MATLAB代码如下:

% 读取输入图像
img = imread('ceshi.jpg');
imshow(img);
title('原始图像');

% 将图像转换为灰度图
gray_img = rgb2gray(img);

% 应用高斯平滑以减少噪声
smooth_img = imgaussfilt(gray_img, 1); % 可以调整标准差来控制平滑程度

% 执行Canny边缘检测
edges = edge(smooth_img, 'Canny');

% 增强边缘
enhanced_img = img;
enhanced_img(edges) = 255; % 将边缘的像素值设置为最大值(255),使边缘更加明显

% 显示增强后的图像
figure;
imshow(enhanced_img);
title('边缘增强后的图像');

 其运行结果如下(左边是检测后的图像,右边是原图):

  • 10
    点赞
  • 71
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值