边缘检测原理内含三种算法.docx
《边缘检测原理内含三种算法.docx》由会员分享,可在线阅读,更多相关《边缘检测原理内含三种算法.docx(12页珍藏版)》请在冰豆网上搜索。
边缘检测原理内含三种算法
边
缘
检
测
原
理
的
论
述
摘 要
数字图像处理技术是信息科学中近几十年来发展最为迅速的学科之一。
图像边缘是图像最基本的一种特征,边缘在图像的分析中起着重要的作用。
边缘作为图像的一种基本特征,在图像识别、图像分割、图像增强以及图像压缩等的领域中有较为广泛的应用,其目的就是精确定位边缘,同时更好地抑制噪声。
目前,数字图像处理技术被广泛应用于航空航天、通信、医学及工业生产等领域中。
图像边缘提取的手段多种多样,本文主要通过MATLAB语言编程分别用不同的算子例如Roberts算子、Prewitt算子、Sobel算子、Kirsch算子、Laplacian算子、Log算子和Canny算子等来实现静态图像的边缘检测,并且和检测加入高斯噪声的图像进行对比。
阐述了不同算子在进行图像边缘提取的特点,并在此基础上提出利用小波变换来实现静态图像的边缘检测。
【关键字】 图像边缘 数字图像 边缘检测 小波变换
背景
图像处理就是对图像信息加工以满足人的视觉心理或应用需求的方法。
图像处理方法有光学方法和电子学方法。
从20世纪60年代起随着电子计算机和计算技术的不断提高和普及,数字图像处理进入了高速发展时期,而数字图像处理就是利用数字计算机或其它的硬件设备对图像信息转换而得到的电信号进行某些数学处理以提高图像的实用性。
计算机进行图像处理一般有两个目的:
(1)产生更适合人观察和识别的图像。
(2)希望能由计算机自动识别和理解图像。
数字图像的边缘检测是图像分割、目标区域的识别、区域形状提取等图像分析领域的重要基础,图像处理和分析的第一步往往就是边缘检测。
边缘是图象最基本的特征. 边缘检测在计算机视觉、图象分析等应用中起着重要的作用,是图象分析与识别的重要环节,这是因为子图象的边缘包含了用于识别的有用信息. 所以边缘检测是图像分析和模式识别的主要特征提取手段。
所谓边缘是指其周围像素灰度后阶变化或屋顶状变化的那些像素的集合,它存在于目标与背景、目标与目标、区域与区域,基元与基元之间。
因此它是图象分割所依赖的重要的特征,也是纹理特征的重要信息源和形状特征的基础;而图象的纹理形状特征的提取又常常依赖于图象分割。
图象的边缘提取也是图象匹配的基础,因为它是位置的标志,对灰度的变化不敏感,它可作为匹配的特征点。
图象的其他特征都是由边缘和区域这些基本特征推导出来的. 边缘具有方向和幅度两个特征. 沿边缘走向,像素值变化比较平缓;而垂直与边缘走向,则像素值变化比较剧烈. 而这种剧烈可能呈现阶跃状,也可能呈现斜坡状。
边缘上像素值的一阶导数较大;二阶导数在边缘处值为零,呈现零交叉。
经典的、最简单的边缘检测方法是对原始图象按像素的某邻域构造边缘算子. 由于原始图象往往含有噪声,而边缘和噪声在空间域表现为灰度有比较大的起落;在频域则反应为同是高频分量,这就给边缘检测带来困难.
原理
边缘是图像上灰度变化最剧烈的地方,传统的边缘检测就是利用了这个特点,对图像各个像素点进行微分或求二阶微分来确定边缘像素点。
一阶微分图像的峰值处对应着图像的边缘点;二阶微分图像的过零点处对应着图像的边缘点。
根据数字图像的特点,处理图像过程中常采用差分来代替导数运算,对于图像的简单一阶导数运算,由于具有固定的方向性,只能检测特定方向的边缘,所以不具有普遍性。
为了克服一阶导数的缺点,我们定义图像的梯度为梯度算子,它是图像处理中最常用的一阶微分算法。
图像梯度的最重要性质是梯度的方向是在图像灰度最大变化率上,它恰好可以反映出图像边缘上的灰度变化。
1.Roberts算子
边缘,是指周围像素灰度有阶跃变化或屋顶等变化的那些像素的集合。
图像的边缘对应着图像灰度的不连续性。
显然图像的边缘很少是从一个灰度跳到另一个灰度这样的理想状况。
真实图像的边缘通常都具有有限的宽度呈现出陡峭的斜坡状。
边缘的锐利程度由图像灰度的梯度决定。
梯度是一个向量,∇f指出灰度变化最快的方向和变化量。
梯度大小由
确定。
而梯度方向则由
确定。
因此最简单的边缘检测算子是用图像的垂直和水平差分来逼近梯度算子:
因此当我们寻找边缘的时候,最简单的方法是对每一个像素计算出(2.1.4)的向量,然后求出它的绝对值。
利用这种思想就得到了Roberts算子:
2.Prewitt算子
Roberts算子是直观的也是简单的,但是对噪声多的情况显然效果不好。
实践中人们做了大量的实践,总结出了一些经验,后来Prewitt提出了一个算子,这就是Prewitt算子。
Prewitt边缘检测算子使用两个有向算子(一个水平的,一个是垂直的,一般称为模板),每一个逼近一个偏导数:
如果我们用Prewitt算子检测图像M的边缘的话,我们可以先分别用水平算子和垂直算子对图像进行卷积,得到的是两个矩阵,在不考虑边界的情形下也是和原图像同样大小的M1,M2,他们分别表示图像M中相同位置处的两个偏导数。
然后把M1,M2 对应位置的两个数平方后相加得到一个新的矩阵G,G表示M中各个像素的灰度的梯度值(一个逼近)。
然后就可以通过阀值处理得到边缘图像。
我们假设图像的灰度满足下面这个关系:
则梯度是(
,
) 。
显然,当前像素3×3邻域内像素值为:
定义垂直算子和水平算子形如:
利用这两个模板对当前像素进行卷积,得到的方向导数为:
因此当前像素处的梯度的大小为:
显然要有:
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为最大值}
图2.3.1
图2.3.2 图2.3.3
实验内容
1.实验程序清单:
<1>Roberts算子程序:
clc
clear all close all
A = 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算子程序:
clc
clear all close all
A = 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算子程序
clc
clear all close all
A = 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); d6 = 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 = max(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)的环境下,分别给检测结果。
(图11对未加噪声图片的检测结果 )
(图12 噪声图片的检测结果 )
实验分析
通过图11和图12知,在图像没有噪声的情况下,Roberts算子、Prewitt算子、Kirsch算子,都能够比较准确的检测出图像的边缘。
加入高斯白噪声后,三种边缘检测算子的边缘检测效果都多少受到噪声的干扰,检测出大量的噪声点和伪边缘,甚至无法检测出边缘。
Roberts算子受噪声的影响最大,Kirsch算子、Prewitt算子受噪声影响比Roberts算子小。
由于各种原因,图像总是受到随机噪声的干扰,可以说噪声无处不在。
经典的边缘检测方法由于引入了各种形式的微分运算,从而必然引起对噪声的极度敏感,边缘检测的结果常常是把噪声当作边缘点检测出来,而真正的边缘也由于受到噪声干扰而没有检测出来。
对于有噪声图像来说,一种好的边缘检测方法应该具有良好的噪声抑制能力,同时又有完备的边缘保持特性。
基于一阶微分的边缘检测算子具有实现简单、运算速度快等特点,但其检测受噪声的影响很大,检测结果不可靠,不能准确判定边缘的存在及边缘的准确位置,造成这种情况的原因:
(1)实际边缘灰度与理想边缘灰度值间存在差异,这类算子可能检测出多个边缘;
(2)边缘存在的尺度范围各不相同,这类算子固定的大小不利于检测出不同尺度上的所有边缘;(3)对噪声都比较敏感。
最后总结如下:
Roberts算子:
采用对角线方向相邻两像素之差表示信号的突变,检测水平和垂直方向边缘的性能好于斜线方向,定位精度比较高,但对噪声敏感,检测出的边缘较细。
Prewitt算子:
对噪声有平滑作用,检测出的边缘比较粗,定位精度低,容易损失角点。
Kirsch算子:
Kirsch算子是像素邻域的加权和,模板中心值较大,不但产生较好的边缘效果,而且对噪声具有平滑作用。
但存在伪边缘,边缘比较粗且定位精度低。
参考文献
[1] 朱虹. 数字图像处理基础.科学出版社. 2005
[2] 余成波. 数字图像处理及MATLAB实现. 重庆大学出版社. 2003
[3] 陈书海,傅录祥. 实用数字图像处理. 科学出版社. 2005
[4] 卢洋,张旭秀.图像边缘检测算法的对比分析与研究. 太原科技出版社. 2009