zoukankan      html  css  js  c++  java
  • 图像边缘和轮廓特征的提取方法

    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')

     使用封装好的函数实现上述算子

     1 image=imread('C:/lenagray.jpg')
     2 image=im2double(image);
     3 image1=edge(image, 'roberts');;
     4 subplot(231);
     5 imshow(image1);
     6 title('roberts算子的处理结果')
     7 image2=imfilter(image,fspecial('prewitt'));
     8 subplot(232);
     9 imshow(image2);
    10 title('Prewitt算子的处理结果')
    11 image3=imfilter(image,fspecial('sobel'));
    12 subplot(233);
    13 imshow(image3);
    14 title('sobel算子的处理结果')
    15 image1=edge(image, 'canny');;
    16 subplot(234);
    17 imshow(image1);
    18 title('canny算子的处理结果')
    19 imfilter(image,fspecial('Laplacian'));
    20 subplot(235);
    21 imshow(image1);
    22 title('Laplacian算子的处理结果')

     

  • 相关阅读:
    读书笔记_Effective_C++_条款三十一:将文件间的编译依存关系降至最低(第三部分)
    Spring Boot进阶系列一
    职场进阶之七种武器
    大龄IT程序员的救赎之道
    Web Service
    生产者消费者问题
    SpringBoot集成Apache Shiro
    简单模拟医院叫号系统
    IT小团队管理者的突围之道
    内部推荐
  • 原文地址:https://www.cnblogs.com/henuliulei/p/10645109.html
Copyright © 2011-2022 走看看