一、边缘和边缘检测的概念
图像边缘是指图像中灰度值发生急剧变化的地方,这些变化通常对应于图像中物体的轮廓、边界或纹理的突变处。在数字图像处理中,边缘是图像的一个重要特征,它包含了关于物体形状、位置和大小等关键信息。
边缘检测是数字图像处理和计算机视觉中的基本问题,边缘检测的目的是标识数字图像中亮度变化明显的点。图像属性中的显著变化通常反映了属性的重要事件和变化。 这些包括:深度上的不连续、表面方向不连续、物质属性变化和场景照明变化。 边缘检测是数字图像处理和计算机视觉中,尤其是特征提取中的一个研究领域。
图像的边缘确实具有幅值和方向这两个重要属性。边缘的幅值通常指的是边缘的强度或显著程度。它可以通过计算图像灰度梯度的幅值来得到。灰度梯度是一个向量,既有大小(即幅度)又有方向。在图像中,梯度的大小表示了像素值变化的快慢,即边缘的幅度。当边缘两侧的像素值差异较大时,边缘的幅值就较大,反之则较小。边缘的幅值特性在图像分割、特征提取和图像识别等任务中起着关键作用。通过检测边缘的幅值,可以确定哪些边缘是显著的,哪些边缘是较弱的,从而进一步处理和分析图像。边缘的方向指的是边缘的走向或趋势。在图像中,边缘通常表现为像素值在某一方向上急剧变化,而在另一与其正交的方向上变化相对平缓。这种方向性特征有助于识别和理解图像中的物体和场景。梯度的方向则表示了像素值变化最快的方向,即边缘的方向。通过检测边缘的方向,可以获得图像中物体的轮廓和形状信息,这对于后续的图像处理和分析非常重要。
边缘可以分为不同的类型,如阶跃型边缘、房顶型边缘和凸缘型边缘等,这些类型的边缘在灰度变化上表现出不同的特性。阶跃型边缘是指灰度值在一个很小的范围内发生很大的变化,形成明显的界限;房顶型边缘则是指灰度值先逐渐增加到一个最大值,然后再逐渐减少,形成一个像屋顶一样的形状;凸缘型边缘则是指灰度值先逐渐增加,然后突然减少到一个较低的值,再逐渐增加,形成一个凸起的形状。边缘检测算法通常利用图像灰度值的一阶或二阶导数来检测边缘。一阶导数可以反映灰度值的变化率,而二阶导数则可以反映灰度值变化率的变化,即曲率。常见的边缘检测算子,如Sobel算子、Prewitt算子、Roberts算子、Laplacian算子和Canny算子等,都是基于这些导数原理来设计的。
在实际应用中,边缘检测算法的选择取决于图像的特性、噪声水平以及所需的边缘检测精度等因素。不同的算法有不同的优缺点和适用场景,因此需要根据具体情况进行选择和优化。
图像边缘检测大幅度地减少了数据量,并且剔除了可以认为不相关的信息,保留了图像重要的结构属性。有许多方法用于边缘检测,它们的绝大部分可以划分为两类:基于查找一类和基于零穿越的一类。基于查找的方法通过寻找图像一阶导数中的最大和最小值来检测边界,通常是将边界定位在梯度最大的方向。基于零穿越的方法通过寻找图像二阶导数零穿越来寻找边界,通常是Laplacian过零点或者非线性差分表示的过零点。
二、常用的边缘检测算子
数字图像处理中常用的边缘检测算子有多种,每种算子都有其独特的优缺点和适用场景。以下是对几种常用边缘检测算子的介绍:
大家请注意,Roberts算子通常不使用3x3的矩阵形式,而是使用两个2x2的卷积核来分别计算水平和垂直方向的梯度。Laplacian算子则有多种可能的卷积核形式,上表给出的是其中两种常见的3x3卷积核。Canny算子则是一个更为复杂的边缘检测算法,它不使用单一的卷积核,而是结合了多个处理步骤来得到更精确的边缘检测结果。
常用边缘检测算子及其优缺点
算子名称 | 优点 | 缺点 |
Sobel算子 | 1. 对灰度渐变和噪声较多的图像处理效果较好。2. 实现简单,计算速度快。 | 1. 对边缘定位不是很准确,图像的边缘不止一个像素。2. 对噪声敏感,检测效果较粗糙,难以检测斜向边缘。 |
Prewitt算子 | 1. 实现简单,只需要对图像进行两次卷积运算即可得到边缘信息。2. 抑制噪声的能力相对较强。 | 1. 对边缘定位的准确性较低,容易产生边缘模糊或者定位不准确的问题。2. 对细节的敏感性较低,可能会忽略一些细小的边缘信息。3. 计算复杂度较高,对于大尺寸的图像,进行两次卷积运算需要较大的计算量。 |
Roberts算子 | 1. 边缘定位准确,对噪声抑制能力较弱。2. 常用来处理具有陡峭的低噪声图像,当图像边缘接近于正45度或负45度时,处理效果更理想。 | 1. 对噪声敏感,容易受噪声干扰而产生误检。2. 提取的边缘线条较粗。 |
Laplacian算子 | 1. 各向同性,能对任何走向的界线和线条进行锐化。2. 对细线和孤立点检测效果较好。 | 1. 对噪声非常敏感,常产生双像素宽的边缘。2. 不能检测出边的方向。 |
Canny算子 | 1. 不容易受噪声干扰,能够检测到真正的弱边缘。2. 使用双阈值检测,能够连接弱边缘和强边缘,得到连续的边缘线条。3. 对边缘定位准确,具有较高的边缘检测精度。 | 1. 参数选择较复杂,需要根据具体图像和应用场景进行调整。2. 计算复杂度较高,包括图像平滑、梯度计算、非最大值抑制等多个步骤。 |
三、边缘检测的MATLAB实现
MATLAB提供一个边缘检测内置函数edge,其基本用法是:
BW = edge(I,method)
使用 method
指定的边缘检测算法检测图像 I
中的边缘。
BW = edge(I,method,threshold,direction)
返回强度高于 threshold
的并指定要检测的边缘的方向(边缘的方向有水平-horizontal、垂直-vertical和both-默认)。
下面是基于MATLAB内置函数edge的边缘检测程序代码:
clear all;
close all;
clc;
gray_img = imread('moon.tif'); % 读取图像
edges_x = edge(gray_img, 'Sobel', 'horizontal'); % 水平方向边缘检测
edges_y = edge(gray_img, 'Sobel', 'vertical'); % 垂直方向边缘检测
edge_sobel = edges_x | edges_y; % 合并水平和垂直边缘
edge_prewitt=edge(gray_img,'prewitt');% 使用导数的普瑞维特逼近,通过寻找 I 的梯度最大的那些点来查找边缘。
edge_roberts=edge(gray_img,'roberts');%使用导数的罗伯茨逼近,通过寻找 I 的梯度最大的那些点来查找边缘。
edge_log=edge(gray_img,'Log');%使用高斯拉普拉斯 (LoG) 滤波器对 I 进行滤波后,通过寻找过零点来查找边缘。
edge_canny=edge(gray_img,'canny');%通过寻找 I 的梯度的局部最大值来查找边缘。edge 函数使用高斯滤波器的导数计算梯度。
%此方法使用双阈值来检测强边缘和弱边缘,如果弱边缘与强边缘连通,则将弱边缘包含到输出中。通过使用双阈值,
%坎尼方法相对其他方法不易受噪声干扰,更可能检测到真正的弱边缘。
figure,
subplot(2,3,1),imshow(gray_img),title('原始图像');
subplot(2,3,2),imshow(edge_sobel),title('sobel算子边缘检测结果');
subplot(2,3,3),imshow(edge_prewitt),title('prewitt算子边缘检测结果');
subplot(2,3,4),imshow(edge_roberts),title('roberts算子边缘检测结果');
subplot(2,3,5),imshow(edge_log),title('log算子边缘检测结果');
subplot(2,3,6),imshow(edge_canny),title('canny算子边缘检测结果');
四、结果与讨论
由程序运行结果可以看出,不同的边缘检测算子检测边缘效果并不相同,在MATLAB利用edge函数进行边缘检测中,如不指定方法默认Sobel方法进行检测。
如果大家觉得本文对大家的学习和科研有所帮助,请点赞、关注和收藏,欢迎大家转发!谢x谢大家!