图像边缘和轮廓特征的提取方法

Part1:先介绍几个关于图像处理的概念

1 图像锐化

图像锐化(image sharpening)是补偿图像的轮廓,增强图像的边缘及灰度跳变的部分,使图像变得清晰,分为空域处理和频域处理两类。图像锐化是为了突出图像上地物的边缘、轮廓,或某些线性目标要素的特征。这种滤波方法提高了地物边缘与周围像元之间的反差,因此也被称为边缘增强。

2图像平滑

概念

图像平滑是指用于突出图像的宽大区域、低频成分、主干部分或抑制图像噪声和干扰高频成分的图像处理方法,目的是使图像亮度平缓渐变,减小突变梯度,改善图像质量。

方法

图像平滑的方法包括:插值方法,线性平滑方法,卷积法等等。这样的处理方法根据图像噪声的不同进行平滑,比如椒盐噪声,就采用线性平滑方法!

3理解低频信号和高频信号

  图像中的低频信号和高频信号也叫做低频分量和高频分量。 简单一点说,图像中的高频分量,指的是图像强度(亮度/灰度)变化剧烈的地方,也就是我们常说的边缘(轮廓);图像中的低频分量,指的是图像强度(亮度/灰度)变换平缓的地方,也就是大片色块的地方。  人眼对图像中的高频信号更为敏感,举个例子,在一张白纸上有一行字,那么我们肯定直接聚焦在文字上,而不会太在意白纸本身,这里文字就是高频信号,而白纸就是低频信号。

  图像的高低频是对图像各个位置之间强度变化的一种度量方法. 低频分量:主要对整副图像的强度的综合度量. 高频分量:主要是对图像边缘和轮廓的度量.   如果一副图像的各个位置的强度大小相等,则图像只存在低频分量,从图像的频谱图上看,只有一个主峰,且位于频率为零的位置.

   如果一副图像的各个位置的强度变化剧烈,则图像不仅存在低频分量,同时也存在多种高频分量,从图像的频谱上看,不仅有一个主峰,同时也存在多个旁峰.

Part2:常见的边缘检测算子的原理

不同图像灰度不同,边界处一般会有明显的边缘,利用此特征可以分割图像。需要说明的是:边缘和物体间的边界并不等同,边缘指的是图像中像素的值有突变的地方,而物体间的边界指的是现实场景中的存在于物体之间的边界。有可能有边缘的地方并非边界,也有可能边界的地方并无边缘,因为现实世界中的物体是三维的,而图像只具有二维信息,从三维到二维的投影成像不可避免的会丢失一部分信息;另外,成像过程中的光照和噪声也是不可避免的重要因素。正是因为这些原因,基于边缘的图像分割仍然是当前图像研究中的世界级难题,目前研究者正在试图在边缘提取中加入高层的语义信息。

在实际的图像分割中,往往只用到一阶和二阶导数,虽然,原理上,可以用更高阶的导数,但是,因为噪声的影响,在纯粹二阶的导数操作中就会出现对噪声的敏感现象,三阶以上的导数信息往往失去了应用价值。二阶导数还可以说明灰度突变的类型。在有些情况下,如灰度变化均匀的图像,只利用一阶导数可能找不到边界,此时二阶导数就能提供很有用的信息。二阶导数对噪声也比较敏感,解决的方法是先对图像进行平滑滤波,消除部分噪声,再进行边缘检测。不过,利用二阶导数信息的算法是基于过零检测的,因此得到的边缘点数比较少,有利于后继的处理和识别工作。

各种算子的存在就是对这种导数分割原理进行的实例化计算,是为了在计算过程中直接使用的一种计算单位。

1.Sobel算子

其主要用于边缘检测,在技术上它是以离散型的差分算子,用来运算图像亮度函数的梯度的近似值, Sobel算子是典型的基于一阶导数的边缘检测算子,由于该算子中引入了类似局部平均的运算,因此对噪声具有平滑作用,能很好的消除噪声的影响。Sobel算子对于象素的位置的影响做了加权,与Prewitt算子、Roberts算子相比因此效果更好。

Sobel算子包含两组3x3的矩阵,分别为横向及纵向模板,将之与图像作平面卷积,即可分别得出横向及纵向的亮度差分近似值。实际使用中,常用如下两个模板来检测图像边缘。

检测水平边沿 横向模板 :           检测垂直平边沿 纵向模板:

图像的每一个像素的横向及纵向梯度近似值可用以下的公式结合,来计算梯度的大小。

然后可用以下公式计算梯度方向。

在以上例子中,如果以上的角度Θ等于零,即代表图像该处拥有纵向边缘,左方较右方暗。

缺点是Sobel算子并没有将图像的主题与背景严格地区分开来,换言之就是Sobel算子并没有基于图像灰度进行处理,由于Sobel算子并没有严格地模拟人的视觉生理特征,所以提取的图像轮廓有时并不能令人满意。

2. Isotropic Sobel算子

Sobel算子另一种形式是(Isotropic Sobel)算子,加权平均算子,权值反比于邻点与中心点的距离,当沿不同方向检测边缘时梯度幅度一致,就是通常所说的各向同性Sobel(Isotropic Sobel)算子。模板也有两个,一个是检测水平边沿的 ,另一个是检测垂直平边沿的 。各向同性Sobel算子和普通Sobel算子相比,它的位置加权系数更为准确,在检测不同方向的边沿时梯度的幅度一致。

3. Roberts算子

罗伯茨算子、Roberts算子是一种最简单的算子,是一种利用局部差分算子寻找边缘的算子,他采用对角线方向相邻两象素之差近似梯度幅值检测边缘。检测垂直边缘的效果好于斜向边缘,定位精度高,对噪声敏感,无法抑制噪声的影响。1963年,Roberts提出了这种寻找边缘的算子。

Roberts边缘算子是一个2x2的模板,采用的是对角方向相邻的两个像素之差。从图像处理的实际效果来看,边缘定位较准,对噪声敏感。适用于边缘明显且噪声较少的图像分割。Roberts边缘检测算子是一种利用局部差分算子寻找边缘的算子,Robert算子图像处理后结果边缘不是很平滑。经分析,由于Robert算子通常会在图像边缘附近的区域内产生较宽的响应,故采用上述算子检测的边缘图像常需做细化处理,边缘定位的精度不是很高。

4. Prewitt算子

Prewitt算子是一种一阶微分算子的边缘检测,利用像素点上下、左右邻点的灰度差,在边缘处达到极值检测边缘,去掉部分伪边缘,对噪声具有平滑作用 。其原理是在图像空间利用两个方向模板与图像进行邻域卷积来完成的,这两个方向模板一个检测水平边缘,一个检测垂直边缘。

对数字图像f(x,y),Prewitt算子的定义如下:

G(i)=|[f(i-1,j-1)+f(i-1,j)+f(i-1,j+1)]-[f(i+1,j-1)+f(i+1,j)+f(i+1,j+1)]|

G(j)=|[f(i-1,j+1)+f(i,j+1)+f(i+1,j+1)]-[f(i-1,j-1)+f(i,j-1)+f(i+1,j-1)]|

则 P(i,j)=max[G(i),G(j)]或 P(i,j)=G(i)+G(j)

经典Prewitt算子认为:凡灰度新值大于或等于阈值的像素点都是边缘点。即选择适当的阈值T,若P(i,j)≥T,则(i,j)为边缘点,P(i,j)为边缘图像。这种判定是欠合理的,会造成边缘点的误判,因为许多噪声点的灰度值也很大,而且对于幅值较小的边缘点,其边缘反而丢失了。

Prewitt算子对噪声有抑制作用,抑制噪声的原理是通过像素平均,但是像素平均相当于对图像的低通滤波,所以Prewitt算子对边缘的定位不如Roberts算子。

因为平均能减少或消除噪声,Prewitt梯度算子法就是先求平均,再求差分来求梯度。水平和垂直梯度模板分别为:

检测水平边沿 横向模板                 检测垂直平边沿 纵向模板:

该算子与Sobel算子类似,只是权值有所变化,但两者实现起来功能还是有差距的,据经验得知Sobel要比Prewitt更能准确检测图像边缘。

5.Laplacian算子

Laplace算子是一种各向同性算子,二阶微分算子,在只关心边缘的位置而不考虑其周围的象素灰度差值时比较合适。Laplace算子对孤立象素的响应要比对边缘或线的响应要更强烈,因此只适用于无噪声图象。存在噪声情况下,使用Laplacian算子检测边缘之前需要先进行低通滤波。所以,通常的分割算法都是把Laplacian算子和平滑算子结合起来生成一个新的模板。

拉普拉斯算子也是最简单的各向同性微分算子,具有旋转不变性。一个二维图像函数的拉普拉斯变换是各向同性的二阶导数,定义

了更适合于数字图像处理,将拉式算子表示为离散形式:

另外,拉普拉斯算子还可以表示成模板的形式,如下图所示,

离散拉普拉斯算子的模板:
其扩展模板: 。

拉式算子用来改善因扩散效应的模糊特别有效,因为它符合降制模型。扩散效应是成像过程中经常发生的现象。

Laplacian算子一般不以其原始形式用于边缘检测,因为其作为一个二阶导数,Laplacian算子对噪声具有无法接受的敏感性;同时其幅值产生算边缘,这是复杂的分割不希望有的结果;最后Laplacian算子不能检测边缘的方向;所以Laplacian在分割中所起的作用包括:(1)利用它的零交叉性质进行边缘定位;(2)确定一个像素是在一条边缘暗的一面还是亮的一面;一般使用的是高斯型拉普拉斯算子(Laplacian
of a Gaussian,LoG),由于二阶导数是线性运算,利用LoG卷积一幅图像与首先使用高斯型平滑函数卷积改图像,然后计算所得结果的拉普拉斯是一样的。所以在LoG公式中使用高斯函数的目的就是对图像进行平滑处理,使用Laplacian算子的目的是提供一幅用零交叉确定边缘位置的图像;图像的平滑处理减少了噪声的影响并且它的主要作用还是抵消由Laplacian算子的二阶导数引起的逐渐增加的噪声影响。

6.Canny算子

该算子功能比前面几种都要好,但是它实现起来较为麻烦,Canny算子是一个具有滤波,增强,检测的多阶段的优化算子,在进行处理前,Canny算子先利用高斯平滑滤波器来平滑图像以除去噪声,Canny分割算法采用一阶偏导的有限差分来计算梯度幅值和方向,在处理过程中,Canny算子还将经过一个非极大值抑制的过程,最后Canny算子还采用两个阈值来连接边缘。

Canny边缘检测算法

step1: 用高斯滤波器平滑图象;

step2: 用一阶偏导的有限差分来计算梯度的幅值和方向;

step3: 对梯度幅值进行非极大值抑制

step4: 用双阈值算法检测和连接边缘

几种算子的比较
Robert算子定位比较精确,但由于不包括平滑,所以对于噪声比较敏感。Prewitt算子和Sobel算子都是一阶的微分算子,而前者是平均滤波,后者是加权平均滤波且检测的图像边缘可能大于2个像素。这两者对灰度渐变低噪声的图像有较好的检测效果,但是对于混合多复杂噪声的图像,处理效果就不理想了。LOG滤波器方法通过检测二阶导数过零点来判断边缘点。LOG滤波器中的a正比于低通滤波器的宽度,a越大,平滑作用越显著,去除噪声越好,但图像的细节也损失越大,边缘精度也就越低。所以在边缘定位精度和消除噪声级间存在着矛盾,应该根据具体问题对噪声水平和边缘点定位精度要求适当选取。
讨论和比较了几种常用的边缘检测算子。梯度算子计算简单,但精度不高,只能检测出图像大致的轮廓,而对于比较细的边缘可能会忽略。Prewitt 和Sobel 算子比Roberts 效果要好一些。LOG 滤波器和Canny 算子的检测效果优于梯度算子,能够检测出图像较细的边缘部分。不同的系统,针对不同的环境条件和要求,选择合适的算子来对图像进行边缘检测。

Part3:算子代码

sobel算子MATLAB实现

 1 f=imread(‘D:/picture/ZiXia.jpg‘);
 2 f=rgb2gray(f);         %转化成灰度图
 3 f=im2double(f);           %函数im2double 将其值归一化到0~1之间
 4 %使用垂直Sobcl箅子.自动选择阈值
 5 [VSFAT Threshold]=edge(f, ‘sobel‘,‘vertical‘);                    %边缘探测
 6 figure,imshow(f),title(‘ 原始图像,‘);                      %显示原始图像
 7 figure,imshow(VSFAT),title( ‘垂直图像边缘检测‘);
 8 %显示边缘探测图像
 9 %使用水平和垂直Sobel算子,自动选择阈值
10 SFST=edge(f,‘sobel‘,Threshold);
11 figure,imshow(SFST),title(‘水平和垂直图像边缘检测‘);
12 %显示边缘探测图像
13 %使用指定45度角Sobel算子滤波器,指定阂值
14 s45=[-2 -1 0;-1 0 1;0 1 2];
15 SFST45=imfilter(f,s45,‘replicate‘);%功能:对任意类型数组或多维图像进行滤波。
16 SFST45=SFST45>=Threshold;
17 figure,imshow(SFST45),title(‘45度角图像边缘检测‘) ;
18 %显示边缘探测图像 

Roberts算子MATLAB实现

 1 clear all;
 2 clc;
 3 sourcePic=imread(‘D:/picture/ZiXia.jpg‘);
 4 grayPic=mat2gray(sourcePic);
 5 [m,n]=size(grayPic);
 6 newGrayPic=grayPic;
 7 robertsNum=0;
 8 robertThreshold=0.2;
 9 for j=1:m-1
10     for k=1:n-1
11         robertsNum = abs(grayPic(j,k)-grayPic(j+1,k+1)) + abs(grayPic(j+1,k)-grayPic(j,k+1));
12         if(robertsNum > robertThreshold)
13             newGrayPic(j,k)=255;
14         else
15             newGrayPic(j,k)=0;
16         end
17     end
18 end
19 figure,imshow(newGrayPic);
20 title(‘roberts算子的处理结果‘)

PreWitt边缘算子MATLAB实现

 1 clear;
 2 sourcePic=imread(‘D:/picture/ZiXia.jpg‘);
 3 grayPic=mat2gray(sourcePic);
 4 [m,n]=size(grayPic);
 5 newGrayPic=grayPic;
 6 PrewittNum=0;
 7 PrewittThreshold=0.5;%设定阈值
 8 for j=2:m-1 %进行边界提取
 9     for k=2:n-1
10         PrewittNum=abs(grayPic(j-1,k+1)-grayPic(j+1,k+1)+grayPic(j-1,k)-grayPic(j+1,k)+grayPic(j-1,k-1)-grayPic(j+1,k-1))+abs(grayPic(j-1,k+1)+grayPic(j,k+1)+grayPic(j+1,k+1)-grayPic(j-1,k-1)-grayPic(j,k-1)-grayPic(j+1,k-1));
11         if(PrewittNum > PrewittThreshold)
12             newGrayPic(j,k)=255;
13         else
14             newGrayPic(j,k)=0;
15         end
16     end
17 end
18 figure,imshow(newGrayPic);
19 title(‘Prewitt算子的处理结果‘)

Laplacian边缘算子

 1 clear;
 2 sourcePic=imread(‘lena.jpg‘);%图像读入
 3 grayPic=mat2gray(sourcePic);%实现图像的矩阵归一化操作
 4 [m,n]=size(grayPic);
 5 newGrayPic=grayPic;
 6 LaplacianNum=0;%经Laplacian操作得到的每个像素的值
 7 LaplacianThreshold=0.2;%设定阈值
 8 for j=2:m-1 %进行边界提取
 9     for k=2:n-1
10         LaplacianNum=abs(4*grayPic(j,k)-grayPic(j-1,k)-grayPic(j+1,k)-grayPic(j,k+1)-grayPic(j,k-1));
11         if(LaplacianNum > LaplacianThreshold)
12             newGrayPic(j,k)=255;
13         else
14             newGrayPic(j,k)=0;
15         end
16     end
17 end
18 figure,imshow(newGrayPic);
19 title(‘Laplacian算子的处理结果‘)

canny边缘算子

1 I = imread(‘D:/picture/ZiXia.jpg‘);  % 读入图像
2 I=rgb2gray(I);               % 转化为灰色图像
3 imshow(I);title(‘原图‘)
4 BW1 = edge(I,‘canny‘);  % 调用canny函数
5 figure,imshow(BW1);     % 显示分割后的图像,即梯度图像
6 title(‘matlab canny‘)

原文地址:https://www.cnblogs.com/henuliulei/p/10645109.html

时间: 2024-11-05 23:31:37

图像边缘和轮廓特征的提取方法的相关文章

canny算子求图像边缘,edgebox那部分

过程: 1.      彩色图像转换为灰度图像    2.      对图像进行高斯模糊    3.      计算图像梯度,根据梯度计算图像边缘幅值与角度(这里其实用到了微分边缘检测算子来计算梯度幅值方向) 求x,y两个方向的梯度 求幅值与角度 4.      非最大信号压制处理(边缘细化) 也就是把角度分成4个值 得到角度之后,比较中心像素角度上相邻两个像素,如果中心像素小于其中任意一个,则舍弃该边缘像素点,否则保留. 5.      双阈值边缘连接处理 双阈值选择与边缘连接方法通过假设两个

利用matlab自带函数快速提取二值图像的图像边缘 bwperim函数

clear all;close all;clc; I = imread('rice.png'); I = im2bw(I); J = bwperim(I); % 提取二值图像图像边缘 figure; subplot(121);imshow(I);title('原二值图像'); subplot(122);imshow(J);title('图像边缘'); ? 其他提取图像边缘的方法: 利用膨胀和腐蚀提取图像边缘 matlab实现 https://blog.csdn.net/Ibelievesunsh

【数字图像处理】图像边缘锐化之微分运算

图像边缘锐化处理的目的 突出图像的细节,或者增强被模糊的细节,增强图像边缘,便于提取目标物体的边界,对图像进行分割.目标区域识别.区域形状提取等为图像理解和分析打下基础. 图像边缘锐化的基本方法 微分运算 梯度锐化 边缘检测 图像边缘类型 通常,边缘上的灰度变化平缓,而边缘两侧灰度较快.图像的边缘一般是指在局部不连接的图像特征.一般是局部亮度变化最显著的部分,灰度值的变化.颜色分量的突变都可构成边缘信息. 微分运算 我们用微分来定义两个像素点之间的变化率,两个像素点之间差值小,说明不是边界,差值

Max-Min Filter 实现及用于检测图像边缘

一. 边缘检测 边缘检测通常作用于灰度图像上.边缘检测用于检测图像中的线. 边缘检测结果 ↑ 二. 最大 - 最小滤波器(Max - Min) 3*3 Max-Min Filter 算法原理 ↑ 我们知道,图像的细节属于低频信息,图像的边缘属于高频信息.我们使用一定大小的 Max-Min 滤波器作用于图像,当滤波器作用于图像细节时,输出结果往往趋向于0(黑色):而滤波器作用于图像边缘时,Max-Min 输出结果往往趋向于255(白色).所以 最大-最小滤波器 能有效地用于检测图像的边缘和轮廓.

图像边缘检測小结

边缘是图像中灰度发生急剧变化的区域边界. 图像灰度的变化情况能够用图像灰度分布的梯度来表示,数字图像中求导是利用差分近似微分来进行的,实际上经常使用空域微分算子通过卷积来完毕. 一阶导数算子 1)  Roberts算子 Roberts算子是一种斜向偏差分的梯度计算方法.梯度的大小代表边缘的强度.梯度的方向与边缘的走向垂直.Roberts操作实际上是求旋转 \pm" title="\pm" >45度两个方向上微分值的和. Roberts算子定位精度高,在水平和垂直方向的效

提取图像边缘

利用java打开一张图片,并提取其边缘.功能有打开文件,以及提取边缘. 算法原理 由于边缘提取的算法有很多种,而提取的精度在相同阈值的情况下也会有不同的结果. 这次我的边缘提取使用索贝尔算子(Sobel operator). 该算子会把图像每一点的灰度矢量计算出来.而分别为横向及纵向,将之与图像作平面卷积,即可分别得出横向及纵向的亮度差分近似值. 算法核心: public int getGrayPoint(int x, int y) { return grayData[y * width + x

边缘检测算子和小波变换提取图像边缘【matlab】

Roberts边缘检测算子:根据一对互相垂直方向上的差分可用来计算梯度的原理,采用对角线方向相邻两像素之差. 小波变换的方法比较适用于展现夹带在正常信号中的瞬间反常现象,具有方向敏感性.所以可以边缘检测. Roberts边缘检测算子: clear; I=imread('D:\文件及下载相关\图片\gray2.png'); I=rgb2gray(I); grayPic=mat2gray(I); [m,n]=size(grayPic); newGrayPic=grayPic; robertsNum=

opencv:图像边缘发现

拉普拉斯算子 Mat dst; // ksize 3 ,必须是奇数,不同大小会有不同的效果 Laplacian(src, dst, -1, 3, 1.0, 0, BORDER_DEFAULT); imshow("Laplacian", dst); 拉普拉斯算子的缺点:当图像中细节过多,或者有很多噪声的时候,非常容易收到影响 锐化 // 锐化 Mat sh_op = (Mat_<int>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0

opencv 检测图像边缘 Canny算法应用

图解边缘检测 opencv 应用Canny算法进行边缘检测 import cv2 as cv import numpy as np img = cv.imread('baby_g.jpg', 0) # 二值化图像处理后,边缘检测效果更好 _, thresh = cv.threshold(img, 0, 255, cv.THRESH_BINARY + cv.THRESH_OTSU) # canny边缘检测,60以下置为0,180以上置为255,第2.3参数的作用可查看本文最后一部分内容 edges