图像处理中边界和边缘_图像处理卷积图像边界的像素点怎么处理 - CSDN
  • 图像处理中二值图像边界提取

    千次阅读 2018-05-02 16:58:31
    今天下午要完成一部分实验,中间涉及...本来想直接copy一下,结果人家的是.png,而自己是已知图像中的一些数据,所以直接将我得类别标签图转化为二值图,然后按照网上的思路写就可以了,我参考的是:https://www.cnb...

    今天下午要完成一部分实验,中间涉及到二值边界的提取,去百度了一下。根据自己实验的结果表明,方法确实是好用,关键自己之前写过,但是效果不如网上的好!

    需要在别人的基础上结合自己的需要或者自己已有的结果具体问题具体分析。本来想直接copy一下,结果人家的是.png,而自己是已知图像中的一些数据,所以直接将我得类别标签图转化为二值图,然后按照网上的思路写就可以了,我参考的是:https://www.cnblogs.com/tiandsp/archive/2013/04/26/3045747.html

    %%%一下是matlab代码

    %%%TureFlag是我的类别标签图,本来有7类地物,二值化一下就可以。所以如果你的也不是二值图,你可以将图像二值化再做


    function [TrueFlag]=BoundaryJudge(Image,TrueFlag)

    [m,n]=size(TrueFlag);
    imgn=zeros(m,n);
    ed=[-1 -1;0 -1;1 -1;1 0;1 1;0 1;-1 1;-1 0];
    for i=2:m-1
        for j=2:n-1
            if TrueFlag(i,j)==1%如果当前像素是前景像素
                for k=1:8
                    ii=i+ed(k,1);
                    jj=j+ed(k,2);
                    if TrueFlag(ii,jj)==0%当前像素周围如果是背景,边界标记图像相应像素标记
                        imgn(ii,jj)=1;
                    end
                end
            end
        end

    end

       figure;                       %由于只有0,1,所以colormap(gray)也没关系,显示出来就是黑白图
       imagesc(imgn);
       colormap(gray);     

    end


    结果图:

    展开全文
  • 转自:http://dsqiu.iteye.com/blog/1638589 图像锐化和边缘检测本文内容构成:1、图像锐化和边缘检测的基本概念,微分梯度已经差分的定义2、锐化和边...

    转自:http://dsqiu.iteye.com/blog/1638589

                                                                                                                    图像锐化和边缘检测
    本文内容构成:

    1、图像锐化和边缘检测的基本概念,微分梯度已经差分的定义

    2、锐化和边缘检测的像素处理方式(3种)

    3、单方向一阶微分锐化,包括:

    水平方向

    垂直方向

    Kirsch算子

    4、无方向微分锐化,包括:

    Roberts算子

    Sobel算子

    Prewitt算子

    Laplacian算子(二阶微分)

    LOG算子(二阶微分

    5、二阶微分

    6、实验结果对比

      在图像增强过程中,通常利用各类图像平滑算法消除噪声,图像的常见噪声主要有加性噪声、乘性噪声和量化噪声等。一般来说,图像的能量主要集中在其低频部分,噪声所在的频段主要在高频段,同时图像边缘信息也主要集中在其高频部分。这将导致原始图像在平滑处理之后,图像边缘和图像轮廓模糊的情况出现。为了减少这类不利效果的影响,就需要利用图像锐化技术,使图像的边缘变得清晰。图像锐化处理的目的是为了使图像的边缘、轮廓线以及图像的细节变得清晰,经过平滑的图像变得模糊的根本原因是因为图像受到了平均或积分运算,因此可以对其进行逆运算(如微分运算)就可以使图像变得清晰。微分运算是求信号的变化率,由傅立叶变换的微分性质可知,微分运算具有较强高频分量作用。从频率域来考虑,图像模糊的实质是因为其高频分量被衰减,因此可以用高通滤波器来使图像清晰。但要注意能够进行锐化处理的图像必须有较高的性噪比,否则锐化后图像性噪比反而更低,从而使得噪声增加的比信号还要多,因此一般是先去除或减轻噪声后再进行锐化处理。

     图像锐化的方法分为高通滤波和空域微分法。图像的边缘或线条的细节(边缘)部分 与图像频谱的高频分量相对应,因此采用高通滤波让高频分量顺利通过,并适当抑制中低频分量,是图像的细节变得清楚,实现图像的锐化,由于高通滤波我们在前面频域滤波已经讲过,所以这里主要讲空域的方法——微分法。

    一阶微分运算一阶微分主要指梯度模运算,图像的梯度模值包含了边界及细节信息。梯度模算子用于计算梯度模值,通常认为它是边界提取算子,具有极值性、位移不变性和旋转不变性。

    图像在点处的梯度 定义为一个二维列矢量:

    梯度大的幅值即模值,为:

     

    梯度的方向在 最大变化率方向上,方向角可表示为:

     对于离散函数 也有相应的概念和公式,只是用差分代替微分。差分可取为后向差分,前向差分。

    在x,y方向上的一阶向后差分分别定义为:

     梯度定义为:

     其模和方向分别为:


     

       在实际应用中,梯度的模还有很多近似式,如使用x,y方向上差分绝对值替代模来度量

    梯度的模(幅值)就是 最大变化率方向的单位距离所增加的量。由梯度的计算可知,在图像灰度变化较大的边沿区域其梯度值大,在灰度变化平缓的区域梯度值较小,而在灰度均匀的区域其梯度值为零。我们根据得到的梯度值来返回像素的值,如将梯度值大的像素设置成白色,梯度值小的设置为黑色,这样就可以将边缘提取出来了,或者是加强梯度值大的像素灰度值就可以突出细节了达到了锐化的目的。    

     

     

    根据梯度值,进而对像素的处理一般有三种方式:锐化是要突出细节(边界),所以要对边缘的像素加强(比如直接用梯度值作为像素的灰度或者RGB的分量),而边缘检测只要根据设置的阀值,超过阀值的像素灰度设为0,否则设为255。          

     1)辅以阀值判断    设T为阀值,像素的梯度值大于T,则像素的灰度(或者RGB的分量)加上某一个值(如100),加上某一个值(如100)像素的灰度值(或RGB的分量值)后若大于255,取255

       

     

     2)设以某一特定值     设t为阀值,像素的梯度值大于T,则像素的灰度(或者RGB的分量)设置为某一定值La    

                                                                 

     3)二值化图像     设T为阀值,像素的梯度值大于T,则像素的灰度(或者RGB的分量)设置为255,否则设置为0     


                                                                     

     

    根据图像边界(细节,边缘)的拓扑结构,一阶微分锐化具体又分为单方向的一阶微分锐化和无方向的微分锐化          

    单方向的一阶锐化是指对某个特定方向上的边缘(细节)信息的进行加强。最简单的单方向一阶锐化就是水平方向与垂直方向上的锐化。        

    水平方向的锐化非常简单,通过一个可以检测出水平方向上的像素值的变化模板来实现。


                                                                  
     垂直方向只需要将方向改变下就可以得到:
                                                                               

    Kirsch算子

    Kirsch算子采用8个模板对图像上的每一个像素点进行卷积求导数,这8个模板代表8个方向,对图像上的8个特定边缘方向作出最大响应,运算(与3*3像素加权之和,就是对应位置相乘后求和)中取最大值作为图像的边缘输出。下面是8个模板:

                                                                                                   

     

    问题:单方向锐化的计算结果中出现了小于零的像素值?

    方法1:整体加一个正整数,以保证所有的像素值均为正。比如+128,还有<0的则视为0,若有>255视为255处理,这样做的结果是:可以获得类似浮雕的效果。

    方法2:将所有的像素值取绝对值。这样做的结果是,可以获得对边缘的有方向提取。

    无方向一阶锐化问题的提出                  

    前面的锐化处理结果对于人工设计制造的具有矩形特征物体(例如:楼房、汉字等)的边缘的提取很有效。但是,对于不规则形状(如:人物)的边缘提取,则存在信息的缺损。

    为了解决上面的问题,就希望提出对任何方向上的边缘信息均敏感的锐化算法。因为这类锐化方法要求对边缘的方向没有选择,所有称为无方向的锐化算法。

    双方向一次微分运算,直接以梯度值代替

    理论基础:对灰度图像f在纵方向和横方向两个方向进行微分。该算法是同时增强水平和垂直方向的边缘。利用双方向一次微分运算,算出梯度后让梯度值赋给该点的灰度值。

    数学表达式为:

    G(i,j)=sqrt{[f(i,j)-f(i,j-1)]*[f(i,j)-f(i,j-1)]+[f(i,j)-f(i-1,j)]*[f(i,j)-f(i-1,j)]}

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

    边缘检测

    边缘检测算子检查每个像素的领域并对灰度变化率进行量化,通常也包括方向的确定。大多数是基于方向当属模板求卷积的方法。

    将所有的边缘模板逐一作用于图像中的每一个像素,产生最大输出值的边缘模板方向表示该点边缘的方向,如果所有方向上的边缘模板接近于零,该点处没有边缘;如果所有方向上的边缘模板输出值都近似相等,没有可靠边缘方向   

                                                                                

    卷积
                                                                            

    卷积可以简单的看成加权求和的过程。

    下面分别对Roberts算子,Sobel算子,Prewitt算子,Laplacian算子介绍:

    (1)无方向一阶锐化——交叉微分

    交叉微分算子(Robert算子)计算公式如下:

                                                                                    

    特点:算法简单

    (2)无方向一阶锐化——Sobel锐化

    Sobel锐化计算公式如下:

                                                                                                     

    Sobel边缘算子的卷积和如上图所示,图像中的每个像素都用这两个核做卷积。Sobel算子认为邻域的像素对当前像素产生的影响不是等价的,所以距离不同的像素具有不同的权值,对算子结果产生的影响也不同。一般来说,距离越大,产生的影响越小。这两个核分别对垂直边缘和水平边缘响应最大,两个卷积的最大值作为该点的输出位。运算结果是一幅边缘幅度图像。

     特点:锐化的边缘信息较强

    (3)无方向一阶锐化——Priwitt锐化                                                                             

    Priwitt锐化计算公式如下:

    Prewitt算子在一个方向求微分,而在另一个方向求平均,因而对噪声相对不敏感,有抑制噪声作用。但是像素平均相当于对图像的低通滤波,所以Prewitt算子对边缘的定位不如Roberts算子。

    特点:与Sobel相比,有一定的抗干扰性,图像效果比较干净。

    几种方法的效果比较

    Sobel算法与Priwitt算法的思路相同,属于同一类型,因此处理效果基本相同。

    Roberts算法的模板为2*2,提取信息较弱。

    单方向锐化经过处理之后,也可以对边界进行增强。

     

    二阶微分锐化——问题的提出

                                                                                           

    1)对应突变形的细节,通过一阶微分的极值点,二阶微分的过0点均可以检测处理

    2)对应细线行的细节,通过一阶微分的过0点,二阶微分的极小值点均可以检测处理。

    3)对应渐变的细节,一边情况很难检测,但二阶微分的信息比一阶微分的信息略多。

    二阶微分锐化——算法推导


                                                                                    
     
                                                 

     

    将上面推导的公式写成模板系数形式,即为Laplacian算子:     

    Laplacian算子利用二阶导数信息,具有各向同性,即与坐标轴方向无关,坐标轴旋转后梯度结果不变。使得图像经过二阶微分后,在边缘处产生一个陡峭的零交叉点,根据这个对零交叉点判断边缘。                                                                    

    Laplacian变形算子

                                                                      

    为了改善锐化效果,可以脱离微分的计算原理,在原有的算子基础上,对模板系数进行改变,获得Laplacian变形算子:

    其中H2是在H1的基础上在考虑45°和135°方向的结果

                                                                

    Laplacian算子对噪声比较敏感,Laplacian算子有一个缺点是它对图像中的某些边缘产生双重响应。所以图像一般先经过平滑处理,通常把Laplacian算子和平滑算子结合起来生成一个新的模板。

    Log边缘算子

    现在介绍一种利用图像强度二阶导数的零交叉点来求边缘点的算法对噪声十分敏感,所以在边缘增强前滤除噪声。为此,马尔(Marr)和希尔得勒斯(Hildreth)根据人类视觉特性提出了一种边缘检测的方法,该方法将高斯滤波和拉普拉斯检测算子结合在一起进行边缘检测的方法,故称为Log(Laplacian of Gassian )算法。也称之为拉普拉斯高斯算法。该算法的主要思路和步骤如下:

    (1)滤波:首先对图像f(x,y)进行平滑滤波,其滤波函数根据人类视觉特性选为高斯函数,即:

     

    其中,G(x,y)是一个圆对称函数,其平滑的作用是可通过  来控制的。将图像 G(x,y)与f(x,y) 进行卷积,可以得到一个平滑的图像,即:

    (2)增强:对平滑图像g(x,y) 进行拉普拉斯运算,即:

                                                                       

    (3)检测:边缘检测判据是二阶导数的零交叉点(即h(x,y)=0  的点)并对应一阶导数的较大峰值。

     这种方法的特点是图像首先与高斯滤波器进行卷积,这样既平滑了图像又降低了噪声,孤立的噪声点和较小的结构组织将被滤除。但是由于平滑会造成图像边缘的延伸,因此边缘检测器只考虑那些具有局部梯度最大值的点为边缘点。这一点可以用二阶导数的零交叉点来实现。拉普拉斯函数用二维二阶导数的近似,是因为它是一种无方向算子。在实际应用中为了避免检测出非显著边缘,应选择一阶导数大于某一阈值的零交叉点作为边缘点。由于对平滑图像g(x,y) 进行拉普拉斯运算可等效为G(x,y) 的拉普拉斯运算与f(x,y) 的卷积,故上式变为:

                                                                   

    式中  称为LOG滤波器,其为:

                                                         
    这样就有两种方法求图像边缘:

    ①先求图像与高斯滤波器的卷积,再求卷积的拉普拉斯的变换,然后再进行过零判断。

    ②求高斯滤波器的拉普拉斯的变换,再求与图像的卷积,然后再进行过零判断。

    这两种方法在数学上是等价的。上式就是马尔和希尔得勒斯提出的边缘检测算子(简称M-H算子),由于LOG滤波器在(x,y) 空间中的图形与墨西哥草帽形状相似,所以又称为墨西哥草帽算子。

    拉普拉斯算子对图像中的嗓声相当敏感。而且它常产生双像素宽的边缘,也不能提供边缘方向的信息。高斯-拉普拉斯算子是效果较好的边沿检测器,常用的5×5模板的高斯--拉普拉斯算子如图2.7所示:

                                                                                        

                                                                                                高斯—拉普拉斯算子

    高斯--拉普拉斯算子把高斯平滑滤波器和拉普拉斯锐化滤波器结合起来,先平化掉噪声,再进行边缘检测,所以效果更好。

    程序的主要思想就是将每个像素的灰度值或RGB的分量与算子矩阵求卷积(用加权求和代替),只是锐化是要突出细节(边界),所以要对边缘的像素加强(比如直接用梯度值作为像素的灰度或者RGB的分量),而边缘检测只要根据设置的阀值,超过阀值的像素灰度设为0,否则设为255。
    查看实验效果:


     

     
    展开全文
  • 数字图像处理--图像锐化和边缘检测

    万次阅读 2018-09-14 10:10:52
     1、图像锐化和边缘检测的基本概念,微分梯度已经差分的定义  2、锐化和边缘检测的像素处理方式(3种)  3、单方向一阶微分锐化,包括:  水平方向  垂直方向  Kirsch算子  4、无方向微分锐化,包括: ...

    本文内容构成:

           1、图像锐化和边缘检测的基本概念,微分梯度已经差分的定义

           2、锐化和边缘检测的像素处理方式(3种)

           3、单方向一阶微分锐化,包括:

                 水平方向

                 垂直方向

                 Kirsch算子

            4、无方向微分锐化,包括:

                 Roberts算子

                 Sobel算子

                 Prewitt算子

                 Laplacian算子(二阶微分)

                 LOG算子(二阶微分

            5、二阶微分

            6、实验结果对比

     

            在图像增强过程中,通常利用各类图像平滑算法消除噪声,图像的常见噪声主要有加性噪声、乘性噪声和量化噪声等。一般来说,图像的能量主要集中在其低频部分,噪声所在的频段主要在高频段,同时图像边缘信息也主要集中在其高频部分。这将导致原始图像在平滑处理之后,图像边缘和图像轮廓模糊的情况出现(平滑可以认为是去除噪声,这样也就模糊了图像的边缘信息)。为了减少这类不利效果的影响,就需要利用图像锐化技术,使图像的边缘变得清晰。图像锐化处理的目的是为了使图像的边缘、轮廓线以及图像的细节变得清晰,经过平滑的图像变得模糊的根本原因是因为图像受到了平均或积分运算,因此可以对其进行逆运算(如微分运算)就可以使图像变得清晰。微分运算是求信号的变化率,由傅立叶变换的微分性质可知,微分运算具有较强高频分量作用。从频率域来考虑,图像模糊的实质是因为其高频分量被衰减,因此可以用高通滤波器来使图像清晰。但要注意能够进行锐化处理的图像必须有较高的性噪比,否则锐化后图像性噪比反而更低,从而使得噪声增加的比信号还要多,因此一般是先去除或减轻噪声后再进行锐化处理

           针对平均或积分运算使图像模糊,可逆行其道而采取微分运算:使用高通滤波器优化高频分量,抑制低频分量,提高图像边界清晰度等。

           图像锐化的方法分为高通滤波和空域微分法。图像的边缘或线条的细节(边缘)部分 与图像频谱的高频分量相对应,因此采用高通滤波让高频分量顺利通过,并适当抑制中低频分量,是图像的细节变得清楚,实现图像的锐化,由于高通滤波我们在前面频域滤波已经讲过,所以这里主要讲空域的方法——微分法。

           边缘是指图象中灰度发生急剧变化的区域。图象灰度的变化情况可以用灰度分布的梯度来反映,给定连续图象f(x,y),其方向导数在边缘法线方向上取得局部最大值。图象中一点的边缘被定义为一个矢量,模为当前点最人的方向导数,方向为该角度代表的方向。通常我们只考虑其模,而不关心方向。

     

           一阶微分运算一阶微分主要指梯度模运算,图像的梯度模值包含了边界及细节信息。梯度模算子用于计算梯度模值,通常认为它是边界提取算子,具有极值性、位移不变性和旋转不变性。

    图像在点处的梯度 定义为一个二维列矢量:

    梯度大的幅值即模值,为:

     

     

    梯度的方向在 最大变化率方向上,方向角可表示为:

            对于离散函数 也有相应的概念和公式,只是用差分代替微分。差分可取为后向差分,前向差分。

    在x,y方向上的一阶向后差分分别定义为:

     梯度定义为:

     其模和方向分别为:


     

            在实际应用中,梯度的模还有很多近似式,如使用x,y方向上差分绝对值替代模来度量

    梯度的模(幅值)就是 最大变化率方向的单位距离所增加的量。由梯度的计算可知,在图像灰度变化较大的边沿区域其梯度值大,在灰度变化平缓的区域梯度值较小,而在灰度均匀的区域其梯度值为零。我们根据得到的梯度值来返回像素的值,如将梯度值大的像素设置成白色,梯度值小的设置为黑色,这样就可以将边缘提取出来了,或者是加强梯度值大的像素灰度值就可以突出细节了达到了锐化的目的。    

     

     

           根据梯度值,进而对像素的处理一般有三种方式:锐化是要突出细节(边界),所以要对边缘的像素加强(比如直接用梯度值作为像素的灰度或者RGB的分量),而边缘检测只要根据设置的阀值,超过阀值的像素灰度设为0,否则设为255。          

     1)辅以阀值判断    设T为阀值,像素的梯度值大于T,则像素的灰度(或者RGB的分量)加上某一个值(如100),加上某一个值(如100)像素的灰度值(或RGB的分量值)后若大于255,取255

       

     

     2)设以某一特定值     设t为阀值,像素的梯度值大于T,则像素的灰度(或者RGB的分量)设置为某一定值La    

                                                                 

     3)二值化图像     设T为阀值,像素的梯度值大于T,则像素的灰度(或者RGB的分量)设置为255,否则设置为0     


                                                                     

     

           根据图像边界(细节,边缘)的拓扑结构,一阶微分锐化具体又分为单方向的一阶微分锐化和无方向的微分锐化          

    单方向的一阶锐化是指对某个特定方向上的边缘(细节)信息的进行加强。最简单的单方向一阶锐化就是水平方向与垂直方向上的锐化。        

    水平方向的锐化非常简单,通过一个可以检测出水平方向上的像素值的变化模板来实现。


                                                                  
     垂直方向只需要将方向改变下就可以得到:
                                                                               

    Kirsch算子

            Kirsch算子采用8个模板对图像上的每一个像素点进行卷积求导数,这8个模板代表8个方向,对图像上的8个特定边缘方向作出最大响应,运算(与3*3像素加权之和,就是对应位置相乘后求和)中取最大值作为图像的边缘输出。下面是8个模板:

                                                                                                   

     

           问题:单方向锐化的计算结果中出现了小于零的像素值?

           方法1:整体加一个正整数,以保证所有的像素值均为正。比如+128,还有<0的则视为0,若有>255视为255处理,这样做的结果是:可以获得类似浮雕的效果。

           方法2:将所有的像素值取绝对值。这样做的结果是,可以获得对边缘的有方向提取。

     

    无方向一阶锐化问题的提出                  

           前面的锐化处理结果对于人工设计制造的具有矩形特征物体(例如:楼房、汉字等)的边缘的提取很有效。但是,对于不规则形状(如:人物)的边缘提取,则存在信息的缺损。

    为了解决上面的问题,就希望提出对任何方向上的边缘信息均敏感的锐化算法。因为这类锐化方法要求对边缘的方向没有选择,所有称为无方向的锐化算法。

    双方向一次微分运算,直接以梯度值代替

           理论基础:对灰度图像f在纵方向和横方向两个方向进行微分。该算法是同时增强水平和垂直方向的边缘。利用双方向一次微分运算,算出梯度后让梯度值赋给该点的灰度值。

    数学表达式为:

    G(i,j)=sqrt{[f(i,j)-f(i,j-1)]*[f(i,j)-f(i,j-1)]+[f(i,j)-f(i-1,j)]*[f(i,j)-f(i-1,j)]}

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

     

    边缘检测

           

           边缘检测算子检查每个像素的领域并对灰度变化率进行量化,通常也包括方向的确定。大多数是基于方向当属模板求卷积的方法。

    将所有的边缘模板逐一作用于图像中的每一个像素,产生最大输出值的边缘模板方向表示该点边缘的方向,如果所有方向上的边缘模板接近于零,该点处没有边缘;如果所有方向上的边缘模板输出值都近似相等,没有可靠边缘方向   

                                                                                

    卷积
                                                                            

    卷积可以简单的看成加权求和的过程。

    下面分别对Roberts算子,Sobel算子,Prewitt算子,Laplacian算子介绍:

     

    (1)无方向一阶锐化——交叉微分

    交叉微分算子(Robert算子)计算公式如下:

                                                                                    

    特点:算法简单

     

    (2)无方向一阶锐化——Sobel锐化

    Sobel锐化计算公式如下:

                                                                                                     

    Sobel边缘算子的卷积和如上图所示,图像中的每个像素都用这两个核做卷积。Sobel算子认为邻域的像素对当前像素产生的影响不是等价的,所以距离不同的像素具有不同的权值,对算子结果产生的影响也不同。一般来说,距离越大,产生的影响越小。这两个核分别对垂直边缘和水平边缘响应最大,两个卷积的最大值作为该点的输出位。运算结果是一幅边缘幅度图像。

     特点:锐化的边缘信息较强

     

    (3)无方向一阶锐化——Priwitt锐化                                                                             

    Priwitt锐化计算公式如下:

    Prewitt算子在一个方向求微分,而在另一个方向求平均,因而对噪声相对不敏感,有抑制噪声作用。但是像素平均相当于对图像的低通滤波,所以Prewitt算子对边缘的定位不如Roberts算子。

    特点:与Sobel相比,有一定的抗干扰性,图像效果比较干净。

     

    几种方法的效果比较

           Sobel算法与Priwitt算法的思路相同,属于同一类型,因此处理效果基本相同。

           Roberts算法的模板为2*2,提取信息较弱。

           单方向锐化经过处理之后,也可以对边界进行增强。

     

    二阶微分锐化——问题的提出

                                                                                           

           1)对应突变形的细节,通过一阶微分的极值点,二阶微分的过0点均可以检测处理

           2)对应细线行的细节,通过一阶微分的过0点,二阶微分的极小值点均可以检测处理。

           3)对应渐变的细节,一边情况很难检测,但二阶微分的信息比一阶微分的信息略多。

    二阶微分锐化——算法推导


                                                                                    
     
                                                 

     

    将上面推导的公式写成模板系数形式,即为Laplacian算子:     

           Laplacian算子利用二阶导数信息,具有各向同性,即与坐标轴方向无关,坐标轴旋转后梯度结果不变。使得图像经过二阶微分后,在边缘处产生一个陡峭的零交叉点,根据这个对零交叉点判断边缘。                                                                    

    Laplacian变形算子

                                                                      

    为了改善锐化效果,可以脱离微分的计算原理,在原有的算子基础上,对模板系数进行改变,获得Laplacian变形算子:

    其中H2是在H1的基础上在考虑45°和135°方向的结果

                                                                

    Laplacian算子对噪声比较敏感,Laplacian算子有一个缺点是它对图像中的某些边缘产生双重响应。所以图像一般先经过平滑处理,通常把Laplacian算子和平滑算子结合起来生成一个新的模板。

    Log边缘算子

    现在介绍一种利用图像强度二阶导数的零交叉点来求边缘点的算法对噪声十分敏感,所以在边缘增强前滤除噪声。为此,马尔(Marr)和希尔得勒斯(Hildreth)根据人类视觉特性提出了一种边缘检测的方法,该方法将高斯滤波和拉普拉斯检测算子结合在一起进行边缘检测的方法,故称为Log(Laplacian of Gassian )算法。也称之为拉普拉斯高斯算法。该算法的主要思路和步骤如下:

    (1)滤波:首先对图像f(x,y)进行平滑滤波,其滤波函数根据人类视觉特性选为高斯函数,即:

     

    其中,G(x,y)是一个圆对称函数,其平滑的作用是可通过  来控制的。将图像 G(x,y)与f(x,y) 进行卷积,可以得到一个平滑的图像,即:

    (2)增强:对平滑图像g(x,y) 进行拉普拉斯运算,即:

                                                                       

    (3)检测:边缘检测判据是二阶导数的零交叉点(即h(x,y)=0  的点)并对应一阶导数的较大峰值。

     这种方法的特点是图像首先与高斯滤波器进行卷积,这样既平滑了图像又降低了噪声,孤立的噪声点和较小的结构组织将被滤除。但是由于平滑会造成图像边缘的延伸,因此边缘检测器只考虑那些具有局部梯度最大值的点为边缘点。这一点可以用二阶导数的零交叉点来实现。拉普拉斯函数用二维二阶导数的近似,是因为它是一种无方向算子。在实际应用中为了避免检测出非显著边缘,应选择一阶导数大于某一阈值的零交叉点作为边缘点。由于对平滑图像g(x,y) 进行拉普拉斯运算可等效为G(x,y) 的拉普拉斯运算与f(x,y) 的卷积,故上式变为:

                                                                   

    式中  称为LOG滤波器,其为:

                                                         
    这样就有两种方法求图像边缘:

    ①先求图像与高斯滤波器的卷积,再求卷积的拉普拉斯的变换,然后再进行过零判断。

    ②求高斯滤波器的拉普拉斯的变换,再求与图像的卷积,然后再进行过零判断。

    这两种方法在数学上是等价的。上式就是马尔和希尔得勒斯提出的边缘检测算子(简称M-H算子),由于LOG滤波器在(x,y) 空间中的图形与墨西哥草帽形状相似,所以又称为墨西哥草帽算子。

    拉普拉斯算子对图像中的嗓声相当敏感。而且它常产生双像素宽的边缘,也不能提供边缘方向的信息。高斯-拉普拉斯算子是效果较好的边沿检测器,常用的5×5模板的高斯--拉普拉斯算子如图2.7所示:

                                                                                        

                                                                                                高斯—拉普拉斯算子

    高斯--拉普拉斯算子把高斯平滑滤波器和拉普拉斯锐化滤波器结合起来,先平化掉噪声,再进行边缘检测,所以效果更好。

    程序的主要思想就是将每个像素的灰度值或RGB的分量与算子矩阵求卷积(用加权求和代替),只是锐化是要突出细节(边界),所以要对边缘的像素加强(比如直接用梯度值作为像素的灰度或者RGB的分量),而边缘检测只要根据设置的阀值,超过阀值的像素灰度设为0,否则设为255。

    查看实验效果:


     

    展开全文
  • 关于边缘检测的基础来自于一个事实,即在边缘部分,像素值出现”跳跃“或者较大的变化。如果在此边缘部分求取一阶导数,就会看到极值的出现...下面的代码展示了分别对灰度化的图像和原始彩色图像中边缘进行检测: i

    关于边缘检测的基础来自于一个事实,即在边缘部分,像素值出现”跳跃“或者较大的变化。如果在此边缘部分求取一阶导数,就会看到极值的出现。

    而在一阶导数为极值的地方,二阶导数为0,基于这个原理,就可以进行边缘检测。

    关于 Laplace 算法原理,可参考

    0x01. Laplace 算法

    下面的代码展示了分别对灰度化的图像和原始彩色图像中的边缘进行检测:

    import cv2.cv as cv
    
    im=cv.LoadImage('img/building.png', cv.CV_LOAD_IMAGE_COLOR)
    
    # Laplace on a gray scale picture
    gray = cv.CreateImage(cv.GetSize(im), 8, 1)
    cv.CvtColor(im, gray, cv.CV_BGR2GRAY)
    
    aperture=3
    
    dst = cv.CreateImage(cv.GetSize(gray), cv.IPL_DEPTH_32F, 1)
    cv.Laplace(gray, dst,aperture)
    
    cv.Convert(dst,gray)
    
    thresholded = cv.CloneImage(im)
    cv.Threshold(im, thresholded, 50, 255, cv.CV_THRESH_BINARY_INV)
    
    cv.ShowImage('Laplaced grayscale',gray)
    #------------------------------------
    
    # Laplace on color
    planes = [cv.CreateImage(cv.GetSize(im), 8, 1) for i in range(3)]
    laplace = cv.CreateImage(cv.GetSize(im), cv.IPL_DEPTH_16S, 1)
    colorlaplace = cv.CreateImage(cv.GetSize(im), 8, 3)
    
    cv.Split(im, planes[0], planes[1], planes[2], None) #Split channels to apply laplace on each
    for plane in planes:
        cv.Laplace(plane, laplace, 3)
        cv.ConvertScaleAbs(laplace, plane, 1, 0)
    
    cv.Merge(planes[0], planes[1], planes[2], None, colorlaplace)
    
    cv.ShowImage('Laplace Color', colorlaplace)
    #-------------------------------------
    
    cv.WaitKey(0)

    效果展示

    原图

    灰度化图片检测

    原始彩色图片检测

    0x02. Sobel 算法

    Sobel 也是很常用的一种轮廓识别的算法。

    关于 Sobel 导数原理的介绍,可参考

    以下是使用 Sobel 算法进行轮廓检测的代码和效果

    import cv2.cv as cv
    
    im=cv.LoadImage('img/building.png', cv.CV_LOAD_IMAGE_GRAYSCALE)
    
    sobx = cv.CreateImage(cv.GetSize(im), cv.IPL_DEPTH_16S, 1)
    cv.Sobel(im, sobx, 1, 0, 3) #Sobel with x-order=1
    
    soby = cv.CreateImage(cv.GetSize(im), cv.IPL_DEPTH_16S, 1)
    cv.Sobel(im, soby, 0, 1, 3) #Sobel withy-oder=1
    
    cv.Abs(sobx, sobx)
    cv.Abs(soby, soby)
    
    result = cv.CloneImage(im)
    cv.Add(sobx, soby, result) #Add the two results together.
    
    cv.Threshold(result, result, 100, 255, cv.CV_THRESH_BINARY_INV)
    
    cv.ShowImage('Image', im)
    cv.ShowImage('Result', result)
    
    cv.WaitKey(0)

    处理之后效果图(感觉比Laplace效果要好些)

    0x03. cv.MorphologyEx

    cv.MorphologyEx 是另外一种边缘检测的算法

    import cv2.cv as cv
    
    image=cv.LoadImage('img/build.png', cv.CV_LOAD_IMAGE_GRAYSCALE)
    
    #Get edges
    morphed = cv.CloneImage(image)
    cv.MorphologyEx(image, morphed, None, None, cv.CV_MOP_GRADIENT) # Apply a dilate - Erode
    
    cv.Threshold(morphed, morphed, 30, 255, cv.CV_THRESH_BINARY_INV)
    
    cv.ShowImage("Image", image)
    cv.ShowImage("Morphed", morphed)
    
    cv.WaitKey(0)

    0x04. Canny 边缘检测

    Canny 算法可以对直线边界做出很好的检测;

    关于 Canny 算法原理的描述,可参考:

    import cv2.cv as cv
    import math
    
    im=cv.LoadImage('img/road.png', cv.CV_LOAD_IMAGE_GRAYSCALE)
    
    pi = math.pi #Pi value
    
    dst = cv.CreateImage(cv.GetSize(im), 8, 1)
    
    cv.Canny(im, dst, 200, 200)
    cv.Threshold(dst, dst, 100, 255, cv.CV_THRESH_BINARY)
    
    #---- Standard ----
    color_dst_standard = cv.CreateImage(cv.GetSize(im), 8, 3)
    cv.CvtColor(im, color_dst_standard, cv.CV_GRAY2BGR)#Create output image in RGB to put red lines
    
    lines = cv.HoughLines2(dst, cv.CreateMemStorage(0), cv.CV_HOUGH_STANDARD, 1, pi / 180, 100, 0, 0)
    for (rho, theta) in lines[:100]:
        a = math.cos(theta) #Calculate orientation in order to print them
        b = math.sin(theta)
        x0 = a * rho
        y0 = b * rho
        pt1 = (cv.Round(x0 + 1000*(-b)), cv.Round(y0 + 1000*(a)))
        pt2 = (cv.Round(x0 - 1000*(-b)), cv.Round(y0 - 1000*(a)))
        cv.Line(color_dst_standard, pt1, pt2, cv.CV_RGB(255, 0, 0), 2, 4) #Draw the line
    
    #---- Probabilistic ----
    color_dst_proba = cv.CreateImage(cv.GetSize(im), 8, 3)
    cv.CvtColor(im, color_dst_proba, cv.CV_GRAY2BGR) # idem
    
    rho=1
    theta=pi/180
    thresh = 50
    minLength= 120 # Values can be changed approximately to fit your image edges
    maxGap= 20
    
    lines = cv.HoughLines2(dst, cv.CreateMemStorage(0), cv.CV_HOUGH_PROBABILISTIC, rho, theta, thresh, minLength, maxGap)
    for line in lines:
        cv.Line(color_dst_proba, line[0], line[1], cv.CV_RGB(255, 0, 0), 2, 8)
    
    cv.ShowImage('Image',im)
    cv.ShowImage("Cannied", dst)
    cv.ShowImage("Hough Standard", color_dst_standard)
    cv.ShowImage("Hough Probabilistic", color_dst_proba)
    cv.WaitKey(0)

    原图

    使用 Canny 算法处理之后

    标记出标准的直线

    标记出所有可能的直线

    0x05. 轮廓检测

    OpenCV 提供一个 FindContours 函数可以用来检测出图像中对象的轮廓:

    import cv2.cv as cv
    
    orig = cv.LoadImage('img/build.png', cv.CV_LOAD_IMAGE_COLOR)
    im = cv.CreateImage(cv.GetSize(orig), 8, 1)
    cv.CvtColor(orig, im, cv.CV_BGR2GRAY)
    #Keep the original in colour to draw contours in the end
    
    cv.Threshold(im, im, 128, 255, cv.CV_THRESH_BINARY)
    cv.ShowImage("Threshold 1", im)
    
    element = cv.CreateStructuringElementEx(5*2+1, 5*2+1, 5, 5, cv.CV_SHAPE_RECT)
    
    cv.MorphologyEx(im, im, None, element, cv.CV_MOP_OPEN) #Open and close to make appear contours
    cv.MorphologyEx(im, im, None, element, cv.CV_MOP_CLOSE)
    cv.Threshold(im, im, 128, 255, cv.CV_THRESH_BINARY_INV)
    cv.ShowImage("After MorphologyEx", im)
    # --------------------------------
    
    vals = cv.CloneImage(im) #Make a clone because FindContours can modify the image
    contours=cv.FindContours(vals, cv.CreateMemStorage(0), cv.CV_RETR_LIST, cv.CV_CHAIN_APPROX_SIMPLE, (0,0))
    
    _red = (0, 0, 255); #Red for external contours
    _green = (0, 255, 0);# Gren internal contours
    levels=2 #1 contours drawn, 2 internal contours as well, 3 ...
    cv.DrawContours (orig, contours, _red, _green, levels, 2, cv.CV_FILLED) #Draw contours on the colour image
    
    cv.ShowImage("Image", orig)
    cv.WaitKey(0)

    效果图:

    原图

    识别结果

    0x06. 边界检测

    import cv2.cv as cv
    
    im = cv.LoadImage("img/build.png", cv.CV_LOAD_IMAGE_GRAYSCALE)
    
    dst_32f = cv.CreateImage(cv.GetSize(im), cv.IPL_DEPTH_32F, 1)
    
    neighbourhood = 3
    aperture = 3
    k = 0.01
    maxStrength = 0.0
    threshold = 0.01
    nonMaxSize = 3
    
    cv.CornerHarris(im, dst_32f, neighbourhood, aperture, k)
    
    minv, maxv, minl, maxl = cv.MinMaxLoc(dst_32f)
    
    dilated = cv.CloneImage(dst_32f)
    cv.Dilate(dst_32f, dilated) # By this way we are sure that pixel with local max value will not be changed, and all the others will
    
    localMax = cv.CreateMat(dst_32f.height, dst_32f.width, cv.CV_8U)
    cv.Cmp(dst_32f, dilated, localMax, cv.CV_CMP_EQ) #compare allow to keep only non modified pixel which are local maximum values which are corners.
    
    threshold = 0.01 * maxv
    cv.Threshold(dst_32f, dst_32f, threshold, 255, cv.CV_THRESH_BINARY)
    
    cornerMap = cv.CreateMat(dst_32f.height, dst_32f.width, cv.CV_8U)
    cv.Convert(dst_32f, cornerMap) #Convert to make the and
    cv.And(cornerMap, localMax, cornerMap) #Delete all modified pixels
    
    radius = 3
    thickness = 2
    
    l = []
    for x in range(cornerMap.height): #Create the list of point take all pixel that are not 0 (so not black)
        for y in range(cornerMap.width):
            if cornerMap[x,y]:
                l.append((y,x))
    
    for center in l:
        cv.Circle(im, center, radius, (255,255,255), thickness)
    
    
    cv.ShowImage("Image", im)
    cv.ShowImage("CornerHarris Result", dst_32f)
    cv.ShowImage("Unique Points after Dilatation/CMP/And", cornerMap)
    
    cv.WaitKey(0)
    展开全文
  • 边缘连接和边界检测 通常情况下,检测出的像素并不能完全描述边缘特性,需要紧接连接算法,才能组合成有意义的边缘或区域边界。 1局部处理 2区域处理 按给出的顺序追踪这些点 3使用霍夫变换的全局处理 通常所...
  • 边界跟踪 边缘检测 边缘连接

    万次阅读 2006-02-20 10:02:00
    边界跟踪 假定我们从一个梯度幅值图像着手进行处理,这个图像是从一幅处于物体具有反差的背景的单一物体的图像进行计算得来的。因为灰度级最高的点(即在原始图像中梯度值最高的点)必然在边界上,所以我们可以...
  • 关于“轮廓检测”边缘检测”这两个自己也弄的不是特别清楚,可能确实比较相似吧。下面简单说一下自己的看法。...轮廓检测指检测图像中的对象边界,更偏向于关注上层语义对象。如OpenCV的findContours
  • 边缘检测是所有基于边界的分割方法的第一步(串行、并行)。 ●两个具有不同灰度值的相邻区域之间总存在边缘。 ●边缘是灰度值不连续的结果,这种不连续常可利用求导数方便检测到,一般常用一阶二阶导数来检测...
  • OpenCV-图像处理(16、处理边缘

    千次阅读 2019-01-15 14:09:33
    图像卷积的时候边界像素,不能被卷积操作,原因在于边界像素没有完全跟kernel重叠,所以当3x3滤波时候有1个像素的边缘没有被处理,5x5滤波的时候有2个像素的边缘没有被处理处理边缘 在卷积开始之前增加边缘像素...
  • 形态学图像处理边界提取与跟踪

    千次阅读 2019-08-11 22:07:58
    要在二值图像中提取物体的边界,容易想到的一个方法是将所有物体内部的点删除(置为背景色)。具体地说,可以逐行扫描图像,如果发现一个黑点的8个邻域都是黑点,则该点为内部点,在目标图 像中将它删除。实际上这...
  • 坚持写下去,虽然简单,但希望可以帮助到别人...而边缘存在于图像的不规则结构不平稳现象,也即存在于信号的突变点处,这些点给出了图像轮廓的位置,这些轮廓常常是我们在图像边缘检测时所需要的非常重要的一些...
  • 图像滤波之边界处理方式(opencv)

    千次阅读 2019-03-27 08:58:14
    BORDER_DEFAULT(边界默认)openCV默认的处理方法,自动填充图像边界(效果像是映像一样)。 BORDER_CONSTANT – (边界常数)填充边缘用指定像素值,使用常数填充边界,不一定是0或者RGB黑色。 BORDER_REPLICATE ...
  • 图像处理常用边缘检测算子总结

    万次阅读 多人点赞 2013-06-05 10:20:42
    需要说明的是:边缘和物体间的边界并不等同,边缘指的是图像中像素的值有突变的地方,而物体间的边界指的是现实场景的存在于物体之间的边界。有可能有边缘的地方并非边界,也有可能边界的地方并无边缘,因为现实...
  • 图像处理中,用边缘检测算法检测到图物体边缘都是弯弯曲曲的,如何将这些直线变直?
  • 图像处理之图像的边缘、轮廓检测

    万次阅读 2017-06-17 15:49:18
    图像边缘、轮廓检测在人类视觉计算机视觉均起着重要的作用。人类能够仅凭一张背景剪影或一张草图就能识别出物体的类型姿态。OpenCV提供了许多边缘检测l滤波函数,包括Laplacian( )、Sobel()以及Scharr()...
  • MATLAB图像处理之图像边缘提取

    万次阅读 2018-10-02 23:06:53
    MATLAB有几种算法可以对图像进行边缘提取,其中一种就是edge算法,这个edge算法有好几个算子,每一个算子分别对应着一种边缘提取的原理,接下来就来看一下几种方法的异同 %读取一张图片,并显示 original_...
  • [图像处理]sobel算子边缘检测算法

    万次阅读 2018-09-16 21:38:05
    边缘检测算法是图像处理中最为基本的问题。其目的是标志图像出亮度变化明显的点,从而反映出图像重要变化。   先介绍一下Sobel算子: Sobel 算子是像素图像边缘检测最重要的算子之一,该算子包含两组3x3的...
  • 图像处理边缘处理

    千次阅读 2019-04-29 12:19:30
    在卷积开始前增加边缘像素,填充限速值为0或者RGB黑色,如3*3在四周各填充一个像素的边缘,这样就确保图像边缘处理,在卷积处理之后再去掉这些边缘,opencv默认的处理方法是:BORDER_DEFAULT,此外常用的还有...
  • 图像处理边界跟踪

    千次阅读 2017-11-10 21:01:55
    matlab函数:B=bwboundaries(img); 使用栈实现代码: close all;clear all; img = imread('G:/bound.jpg'); img = rgb2gray(img); img = im2bw(img); img=im2bw(img); B=bwboundaries(img);...fla
  • 在图像识别,如果可以将图像感兴趣的物体或区别分割出来,无疑可以增加我们图像识别的准确率,传统的数字图像处理中的分割方法多数基于灰度值的两个基本性质 不连续性、 以灰度突变为基础分割一副图像,比如...
1 2 3 4 5 ... 20
收藏数 23,082
精华内容 9,232
关键字:

图像处理中边界和边缘