当前位置:文档之家› 边缘检测原理(内含三种算法)

边缘检测原理(内含三种算法)

边缘检测原理的论述摘要数字图像处理技术是信息科学中近几十年来发展最为迅速的学科之一。

图像边缘是图像最基本的一种特征,边缘在图像的分析中起着重要的作用。

边缘作为图像的一种基本特征,在图像识别、图像分割、图像增强以及图像压缩等的领域中有较为广泛的应用,其目的就是精确定位边缘,同时更好地抑制噪声。

目前,数字图像处理技术被广泛应用于航空航天、通信、医学及工业生产等领域中。

图像边缘提取的手段多种多样,本文主要通过MATLAB语言编程分别用不同的算子例如Roberts算子、Prewitt算子、Sobel算子、Kirsch算子、Laplacian算子、Log算子和Canny算子等来实现静态图像的边缘检测,并且和检测加入高斯噪声的图像进行对比。

阐述了不同算子在进行图像边缘提取的特点,并在此基础上提出利用小波变换来实现静态图像的边缘检测。

【关键字】图像边缘数字图像边缘检测小波变换背景图像处理就是对图像信息加工以满足人的视觉心理或应用需求的方法。

图像处理方法有光学方法和电子学方法。

从20世纪60年代起随着电子计算机和计算技术的不断提高和普及,数字图像处理进入了高速发展时期,而数字图像处理就是利用数字计算机或其它的硬件设备对图像信息转换而得到的电信号进行某些数学处理以提高图像的实用性。

计算机进行图像处理一般有两个目的:(1)产生更适合人观察和识别的图像。

(2)希望能由计算机自动识别和理解图像。

数字图像的边缘检测是图像分割、目标区域的识别、区域形状提取等图像分析领域的重要基础,图像处理和分析的第一步往往就是边缘检测。

边缘是图象最基本的特征.边缘检测在计算机视觉、图象分析等应用中起着重要的作用,是图象分析与识别的重要环节,这是因为子图象的边缘包含了用于识别的有用信息.所以边缘检测是图像分析和模式识别的主要特征提取手段。

所谓边缘是指其周围像素灰度后阶变化或屋顶状变化的那些像素的集合,它存在于目标与背景、目标与目标、区域与区域,基元与基元之间。

因此它是图象分割所依赖的重要的特征,也是纹理特征的重要信息源和形状特征的基础;而图象的纹理形状特征的提取又常常依赖于图象分割。

图象的边缘提取也是图象匹配的基础,因为它是位置的标志,对灰度的变化不敏感,它可作为匹配的特征点。

图象的其他特征都是由边缘和区域这些基本特征推导出来的.边缘具有方向和幅度两个特征.沿边缘走向,像素值变化比较平缓;而垂直与边缘走向,则像素值变化比较剧烈.而这种剧烈可能呈现阶跃状,也可能呈现斜坡状。

边缘上像素值的一阶导数较大;二阶导数在边缘处值为零,呈现零交叉。

经典的、最简单的边缘检测方法是对原始图象按像素的某邻域构造边缘算子.由于原始图象往往含有噪声,而边缘和噪声在空间域表现为灰度有比较大的起落;在频域则反应为同是高频分量,这就给边缘检测带来困难.原理边缘是图像上灰度变化最剧烈的地方,传统的边缘检测就是利用了这个特点,对图像各个像素点进行微分或求二阶微分来确定边缘像素点。

一阶微分图像的峰值处对应着图像的边缘点;二阶微分图像的过零点处对应着图像的边缘点。

根据数字图像的特点,处理图像过程中常采用差分来代替导数运算,对于图像的简单一阶导数运算,由于具有固定的方向性,只能检测特定方向的边缘,所以不具有普遍性。

为了克服一阶导数的缺点,我们定义图像的梯度为梯度算子,它是图像处理中最常用的一阶微分算法。

图像梯度的最重要性质是梯度的方向是在图像灰度最大变化率上,它恰好可以反映出图像边缘上的灰度变化。

1 .Roberts 算子边缘,是指周围像素灰度有阶跃变化或屋顶等变化的那些像素的集合。

图像的边缘对应着图像灰度的不连续性。

显然图像的边缘很少是从一个灰度跳到另一个灰度这样的理想状况。

真实图像的边缘通常都具有有限的宽度呈现出陡峭的斜坡状。

边缘的锐利程度由图像灰度的梯度决定。

梯度是一个向量,∇f 指出灰度变化最快的方向和变化量。

),(f yf x f ∂∂∂∂=∇ 梯度大小由22⎪⎪⎭⎫ ⎝⎛∂∂+⎪⎭⎫ ⎝⎛∂∂=∇y f x f f 确定。

而梯度方向则由⎪⎪⎪⎭⎫ ⎝⎛∂∂∂∂=x f y f θ 确定。

因此最简单的边缘检测算子是用图像的垂直和水平差分来逼近梯度算子:()()))1,(),(,,1,(----=∇y x f y x f y x f y x f f因此当我们寻找边缘的时候,最简单的方法是对每一个像素计算出(2.1.4)的向量,然后求出它的绝对值。

利用这种思想就得到了Roberts 算子:2122})],1()1,([)]1,1(),({[),(y x f y x f y x f y x f y x g +-++++-= 2 .Prewitt 算子Roberts 算子是直观的也是简单的,但是对噪声多的情况显然效果不好。

实践中人们做了大量的实践,总结出了一些经验,后来Prewitt 提出了一个算子,这就是Prewitt 算子。

Prewitt 边缘检测算子使用两个有向算子(一个水平的,一个是垂直的,一般称为模板),每一个逼近一个偏导数:⎪⎪⎪⎭⎫ ⎝⎛---=111000111v p ⎪⎪⎪⎭⎫ ⎝⎛---=101101101h p如果我们用Prewitt 算子检测图像 M 的边缘的话,我们可以先分别用水平算子和垂直算子对图像进行卷积,得到的是两个矩阵,在不考虑边界的情形下也是和原图像同样大小的 M1,M2,他们分别表示图像M 中相同位置处的两个偏导数。

然后把M1,M2 对应位置的两个数平方后相加得到一个新的矩阵G,G 表示M 中各个像素的灰度的梯度值(一个逼近)。

然后就可以通过阀值处理得到边缘图像。

我们假设图像的灰度满足下面这个关系:γβα++=y x M y x ,则梯度是(α,β) 。

显然,当前像素 3×3 邻域内像素值为:⎪⎪⎪⎭⎫ ⎝⎛++++-++-++-+-+--γβαγαγβαγβγγβγβαγαγβα 定义垂直算子和水平算子形如:⎪⎪⎪⎭⎫ ⎝⎛---a b a a b a 000⎪⎪⎪⎭⎫ ⎝⎛---a a b b a a 000 利用这两个模板对当前像素进行卷积,得到的方向导数为 : )2(2)2(2b a g b a g y x +=+=αβ因此当前像素处的梯度的大小为 :22)2(2βα++=b a G显然要有:2(2a+b )= 1我们取 a=b=1/6则得到的模板就是1/6乘Prewitt 算子。

3. Kirsch 算子Kirsch 算子由8个3×3窗口模扳组成、每个模板分别代表一个特定的检测方向,其模板算子如图2.3.1所示。

在进行边缘检测时,把M0-M7所表示的边缘模板(加权矩阵)分别与图像中的一个3×3区域相乘,选取输出值为最大的模板。

然后,把这一最大输出值作为中央像素点上的边缘强度,把取得最大值的边缘模板Mk 的方向k(k 的取值如图2.3.2所示)作为其边缘方向。

假设图像中一点P(i ,j)及其八邻域的灰度如图3.3.3所示,并设Qk(k =0,1,…,7)为图像经过kirsch 算子第k 个模板处理后得到的k 方向上的边缘强度,则P(i,j)的边缘强度为s(i,j)=max|qk|(k=0,1,…,7),而相应的边缘方向D(i ,j)={k|qk 为最大值}⎪⎪⎪⎭⎫ ⎝⎛----+-++⎪⎪⎪⎭⎫ ⎝⎛--+-+--+⎪⎪⎪⎭⎫ ⎝⎛-++-+---⎪⎪⎪⎭⎫ ⎝⎛+++-----⎪⎪⎪⎭⎫⎝⎛++-+----⎪⎪⎪⎭⎫ ⎝⎛+--+-+--⎪⎪⎪⎭⎫ ⎝⎛---+-++-⎪⎪⎪⎭⎫ ⎝⎛-----+++333305355335305335355305333555303333553503333533503533333503553333303555图2.3.1图2.3.2 图2.3.3实验内容1.实验程序清单:<1>Roberts 算子程序:clcclear all close allA = imread('cameraman.tif'); % 读入图像 imshow(A);title('原图');x_mask = [1 0;0 -1]; % 建立X 方向的模板y_mask = rot90(x_mask); % 建立Y方向的模板I = im2double(A); % 将图像数据转化为双精度dx = imfilter(I, x_mask); % 计算X方向的梯度分量dy = imfilter(I, y_mask); % 计算Y方向的梯度分量grad = sqrt(dx.*dx + dy.*dy); % 计算梯度grad = mat2gray(grad); % 将梯度矩阵转换为灰度图像level = graythresh(grad); % 计算灰度阈值BW = im2bw(grad,level); % 用阈值分割梯度图像figure, imshow(BW); % 显示分割后的图像即边缘图像title('Roberts')<2>Prewitt算子程序:clcclear all close allA = imread('cameraman.tif');% 读入图像imshow(A);title('原图');y_mask = [-1 -1 -1;0 0 0;1 1 1]; % 建立Y方向的模板x_mask = y_mask'; % 建立X方向的模板I = im2double(A); % 将图像数据转化为双精度dx = imfilter(I, x_mask); % 计算X方向的梯度分量dy = imfilter(I, y_mask); % 计算Y方向的梯度分量grad = sqrt(dx.*dx + dy.*dy); % 计算梯度grad = mat2gray(grad); % 将梯度矩阵转换为灰度图像level = graythresh(grad); % 计算灰度阈值BW = im2bw(grad,level); % 用阈值分割梯度图像figure, imshow(BW); % 显示分割后的图像即边缘图像title('Prewitt')<3>Kirsch算子程序clcclear all close allA = imread('cameraman.tif'); % 读入图像imshow(A);title('原图');mask1=[-3,-3,-3;-3,0,5;-3,5,5]; % 建立方向模板mask2=[-3,-3,5;-3,0,5;-3,-3,5]; mask3=[-3,5,5;-3,0,5;-3,-3 ,-3]; mask4=[-3,-3,-3;-3,0,-3;5,5,5]; mask5=[5,5,5;-3,0,-3;-3,-3,-3]; mask6=[-3,-3,-3;5,0,-3;5,5,-3]; mask7=[5,-3, -3;5,0,-3;5,-3,-3];mask8=[5,5,-3;5,0,-3;-3,-3,-3];I = im2double(A); % 将数据图像转化为双精度d1 = imfilter(I, mask1); % 计算8个领域的灰度变化d2 = imfilter(I, mask2); d3 = imfilter(I, mask3);d4 = imfilter(I, mask4); d5 = imfilter(I, mask5); d 6 = imfilter(I, mask6);d7 = imfilter(I, mask7); d8 = imfilter(I, mask8);dd = max(abs(d1),abs(d2)); % 取差值变化最大的元素组成灰度变化矩阵dd = max(dd,abs(d3)); dd = max(dd,abs(d4)); dd = ma x(dd,abs(d5)); dd = max(dd,abs(d6));dd = max(dd,abs(d7)); dd = max(dd,abs(d8));grad = mat2gray(dd); % 将灰度变化矩阵转化为灰度图像level = graythresh(grad); % 计算灰度阈值BW = im2bw(grad,level); % 用阈值分割梯度图像figure, imshow(BW); % 显示分割后的图像,即边缘图像title('Kirsch')2.实验结果以cameraman图片为例,分别用Roberts、Prewitt和Kirsch三种算法,在无噪声(图11)和有高斯白噪声(图12)的环境下,分别给检测结果。

相关主题