•  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。
    查看实验效果:


     

    展开全文
  • matlab边缘检测
  • matlab图像复原和图像增强技术; matlab边缘检测图像分割; matlab图像编码与压缩技术入门;
  • %单线条效果 handles.pic=imread('I:\技术照片\手绘油画\psb (6).jpg'); figure,imshow(handles.pic);title('原图效果'); handles.pic=rgb2gray(handles.pic); figure,imshow(handles.pic);title('灰度效果');...
    %单线条效果
    handles.pic=imread('I:\技术照片\手绘油画\psb (6).jpg');
    figure,imshow(handles.pic);title('原图效果');
    handles.pic=rgb2gray(handles.pic);
    figure,imshow(handles.pic);title('灰度效果');
    bw=edge(handles.pic,'canny');%数字图像轮廓提取 
    se = strel('line',3,0);%创建直线长度3角度为0形态学元素
    bwd=imdilate(bw,se);%对图像实施膨胀操作
    figure,imshow(bwd);title('单线条效果');
    %matlab实现油画,浮雕,伪色彩,底片,单线条效果程序。
    %下载http://www.wenkuxiazai.com/doc/515b31260722192e4536f64b-10.html
    d=imcomplement(bwd);
    figure,imshow(d);
    title('白底黑线图像') 

    展开全文
  • 1.图像反转 MATLAB程序实现如下: I=imread('xian.bmp'); J=double(I); J=-J+(256-1);%图像反转线性变换 H=uint8(J); subplot(1,2,1),imshow(I); subplot(1,2,2),imshow(H); 2.灰度线性变换 MATLAB程序实现如下: I...

    1.图像反转
    MATLAB程序实现如下:
    I=imread('xian.bmp');
    J=double(I);
    J=-J+(256-1);                 %图像反转线性变换
    H=uint8(J);
    subplot(1,2,1),imshow(I);
    subplot(1,2,2),imshow(H);

    2.灰度线性变换
    MATLAB程序实现如下:
    I=imread('xian.bmp');
    subplot(2,2,1),imshow(I);
    title('原始图像');
    axis([50,250,50,200]);
    axis on;                  %显示坐标系
    I1=rgb2gray(I);
    subplot(2,2,2),imshow(I1);
    title('灰度图像');
    axis([50,250,50,200]);
    axis on;                  %显示坐标系
    J=imadjust(I1,[0.1 0.5],[]); %局部拉伸,把[0.1 0.5]内的灰度拉伸为[0 1]
    subplot(2,2,3),imshow(J);
    title('线性变换图像[0.1 0.5]');
    axis([50,250,50,200]);
    grid on;                  %显示网格线
    axis on;                  %显示坐标系
    K=imadjust(I1,[0.3 0.7],[]); %局部拉伸,把[0.3 0.7]内的灰度拉伸为[0 1]
    subplot(2,2,4),imshow(K);
    title('线性变换图像[0.3 0.7]');
    axis([50,250,50,200]);
    grid on;                  %显示网格线
    axis on;                  %显示坐标系

    3.非线性变换
    MATLAB程序实现如下:
    I=imread('xian.bmp');
    I1=rgb2gray(I);
    subplot(1,2,1),imshow(I1);
    title('灰度图像');
    axis([50,250,50,200]);
    grid on;                  %显示网格线
    axis on;                  %显示坐标系
    J=double(I1);
    J=40*(log(J+1));
    H=uint8(J);
    subplot(1,2,2),imshow(H);
    title('对数变换图像');
    axis([50,250,50,200]);
    grid on;                  %显示网格线
    axis on;                  %显示坐标系

    4.直方图均衡化
    MATLAB程序实现如下:
    I=imread('xian.bmp');
    I=rgb2gray(I);
    figure;
    subplot(2,2,1);
    imshow(I);
    subplot(2,2,2);
    imhist(I);
    I1=histeq(I);
    figure;
    subplot(2,2,1);
    imshow(I1);
    subplot(2,2,2);
    imhist(I1);

    5.线性平滑滤波器
    用MATLAB实现领域平均法抑制噪声程序:
    I=imread('xian.bmp');
    subplot(231)
    imshow(I)
    title('原始图像')
    I=rgb2gray(I);
    I1=imnoise(I,'salt & pepper',0.02);
    subplot(232)
    imshow(I1)
    title('添加椒盐噪声的图像')
    k1=filter2(fspecial('average',3),I1)/255;          %进行3*3模板平滑滤波
    k2=filter2(fspecial('average',5),I1)/255;          %进行5*5模板平滑滤波k3=filter2(fspecial('average',7),I1)/255;          %进行7*7模板平滑滤波
    k4=filter2(fspecial('average',9),I1)/255;          %进行9*9模板平滑滤波
    subplot(233),imshow(k1);title('3*3模板平滑滤波');
    subplot(234),imshow(k2);title('5*5模板平滑滤波');
    subplot(235),imshow(k3);title('7*7模板平滑滤波');
    subplot(236),imshow(k4);title('9*9模板平滑滤波');

    6.中值滤波器
    用MATLAB实现中值滤波程序如下:
    I=imread('xian.bmp');
    I=rgb2gray(I);
    J=imnoise(I,'salt&pepper',0.02);
    subplot(231),imshow(I);title('原图像');
    subplot(232),imshow(J);title('添加椒盐噪声图像');
    k1=medfilt2(J);            %进行3*3模板中值滤波
    k2=medfilt2(J,[5,5]);      %进行5*5模板中值滤波
    k3=medfilt2(J,[7,7]);      %进行7*7模板中值滤波
    k4=medfilt2(J,[9,9]);      %进行9*9模板中值滤波
    subplot(233),imshow(k1);title('3*3模板中值滤波');
    subplot(234),imshow(k2);title('5*5模板中值滤波');
    subplot(235),imshow(k3);title('7*7模板中值滤波');
    subplot(236),imshow(k4);title('9*9模板中值滤波');

    7.用Sobel算子和拉普拉斯对图像锐化:
    I=imread('xian.bmp');
    subplot(2,2,1),imshow(I);
    title('原始图像');
    axis([50,250,50,200]);
    grid on;                  %显示网格线
    axis on;                  %显示坐标系
    I1=im2bw(I);
    subplot(2,2,2),imshow(I1);
    title('二值图像');
    axis([50,250,50,200]);
    grid on;                  %显示网格线
    axis on;                  %显示坐标系
    H=fspecial('sobel');     %选择sobel算子 
    J=filter2(H,I1);            %卷积运算
    subplot(2,2,3),imshow(J); 
    title('sobel算子锐化图像');
    axis([50,250,50,200]);
    grid on;                  %显示网格线
    axis on;                  %显示坐标系
    h=[0 1 0,1 -4 1,0 1 0];   %拉普拉斯算子
    J1=conv2(I1,h,'same');            %卷积运算
    subplot(2,2,4),imshow(J1); 
    title('拉普拉斯算子锐化图像');
    axis([50,250,50,200]);
    grid on;                  %显示网格线
    axis on;                  %显示坐标系

    8.梯度算子检测边缘
    用MATLAB实现如下:
    I=imread('xian.bmp');
    subplot(2,3,1);
    imshow(I);
    title('原始图像');
    axis([50,250,50,200]);
    grid on;                  %显示网格线
    axis on;                  %显示坐标系
    I1=im2bw(I);
    subplot(2,3,2);
    imshow(I1);
    title('二值图像');
    axis([50,250,50,200]);
    grid on;                  %显示网格线
    axis on;                  %显示坐标系
    I2=edge(I1,'roberts');
    figure;
    subplot(2,3,3);
    imshow(I2);
    title('roberts算子分割结果');
    axis([50,250,50,200]);
    grid on;                  %显示网格线
    axis on;                  %显示坐标系
    I3=edge(I1,'sobel');
    subplot(2,3,4);
    imshow(I3);
    title('sobel算子分割结果');
    axis([50,250,50,200]);
    grid on;                  %显示网格线
    axis on;                  %显示坐标系
    I4=edge(I1,'Prewitt');
    subplot(2,3,5);
    imshow(I4);
    title('Prewitt算子分割结果');
    axis([50,250,50,200]);
    grid on;                  %显示网格线
    axis on;                  %显示坐标系

    9.LOG算子检测边缘
    用MATLAB程序实现如下:
    I=imread('xian.bmp');
    subplot(2,2,1);
    imshow(I);
    title('原始图像');
    I1=rgb2gray(I);
    subplot(2,2,2);
    imshow(I1);
    title('灰度图像');
    I2=edge(I1,'log');
    subplot(2,2,3);
    imshow(I2);
    title('log算子分割结果');

    10.Canny算子检测边缘
    用MATLAB程序实现如下:
    I=imread('xian.bmp');
    subplot(2,2,1);
    imshow(I);
    title('原始图像')
    I1=rgb2gray(I);
    subplot(2,2,2);
    imshow(I1);
    title('灰度图像');
    I2=edge(I1,'canny');
    subplot(2,2,3);
    imshow(I2);
    title('canny算子分割结果');

    11.边界跟踪(bwtraceboundary函数)
    clc
    clear all
    I=imread('xian.bmp');
    figure
    imshow(I);
    title('原始图像');
    I1=rgb2gray(I);                %将彩色图像转化灰度图像 
    threshold=graythresh(I1);        %计算将灰度图像转化为二值图像所需的门限
    BW=im2bw(I1, threshold);       %将灰度图像转化为二值图像
    figure
    imshow(BW);
    title('二值图像');
    dim=size(BW);
    col=round(dim(2)/2)-90;         %计算起始点列坐标
    row=find(BW(:,col),1);          %计算起始点行坐标
    connectivity=8;
    num_points=180;
    contour=bwtraceboundary(BW,[row,col],'N',connectivity,num_points); 
    %提取边界
    figure
    imshow(I1);
    hold on;
    plot(contour(:,2),contour(:,1), 'g','LineWidth' ,2);
    title('边界跟踪图像');

    12.Hough变换
    I= imread('xian.bmp');
    rotI=rgb2gray(I);
    subplot(2,2,1);
    imshow(rotI);
    title('灰度图像');
    axis([50,250,50,200]);
    grid on;                 
    axis on; 
    BW=edge(rotI,'prewitt');
    subplot(2,2,2);
    imshow(BW);
    title('prewitt算子边缘检测后图像');
    axis([50,250,50,200]);
    grid on;                 
    axis on; 
    [H,T,R]=hough(BW);
    subplot(2,2,3);
    imshow(H,[],'XData',T,'YData',R,'InitialMagnification','fit');
    title('霍夫变换图');
    xlabel('\theta'),ylabel('\rho');
    axis on , axis normal, hold on;
    P=houghpeaks(H,5,'threshold',ceil(0.3*max(H(:))));
    x=T(P(:,2));y=R(P(:,1));
    plot(x,y,'s','color','white');
    lines=houghlines(BW,T,R,P,'FillGap',5,'MinLength',7);
    subplot(2,2,4);,imshow(rotI);
    title('霍夫变换图像检测');
    axis([50,250,50,200]);
    grid on;                 
    axis on; 
    hold on;
    max_len=0;
    for k=1:length(lines)
    xy=[lines(k).point1;lines(k).point2];
    plot(xy(:,1),xy(:,2),'LineWidth',2,'Color','green');
    plot(xy(1,1),xy(1,2),'x','LineWidth',2,'Color','yellow');
    plot(xy(2,1),xy(2,2),'x','LineWidth',2,'Color','red');
    len=norm(lines(k).point1-lines(k).point2);
    if(len>max_len)
    max_len=len;
    xy_long=xy;
    end
    end
    plot(xy_long(:,1),xy_long(:,2),'LineWidth',2,'Color','cyan');

    13.直方图阈值法
    用MATLAB实现直方图阈值法:
    I=imread('xian.bmp');
    I1=rgb2gray(I);
    figure;
    subplot(2,2,1);
    imshow(I1);
    title('灰度图像')
    axis([50,250,50,200]);
    grid on;                  %显示网格线
    axis on;                  %显示坐标系
    [m,n]=size(I1);                            %测量图像尺寸参数
    GP=zeros(1,256);                           %预创建存放灰度出现概率的向量
    for k=0:255
         GP(k+1)=length(find(I1==k))/(m*n);    %计算每级灰度出现的概率,将其存入GP中相应位置
    end
    subplot(2,2,2),bar(0:255,GP,'g')                   %绘制直方图
    title('灰度直方图')
    xlabel('灰度值')
    ylabel('出现概率') 
    I2=im2bw(I,150/255);   
    subplot(2,2,3),imshow(I2);
    title('阈值150的分割图像')
    axis([50,250,50,200]);
    grid on;                  %显示网格线
    axis on;                  %显示坐标系
    I3=im2bw(I,200/255);   %
    subplot(2,2,4),imshow(I3);
    title('阈值200的分割图像')
    axis([50,250,50,200]);
    grid on;                  %显示网格线
    axis on;                  %显示坐标系

    14. 自动阈值法:Otsu法
    用MATLAB实现Otsu算法:
    clc
    clear all
    I=imread('xian.bmp');
    subplot(1,2,1),imshow(I);
    title('原始图像')
    axis([50,250,50,200]);
    grid on;                  %显示网格线
    axis on;                  %显示坐标系
    level=graythresh(I);     %确定灰度阈值
    BW=im2bw(I,level);
    subplot(1,2,2),imshow(BW);
    title('Otsu法阈值分割图像')
    axis([50,250,50,200]);
    grid on;                  %显示网格线
    axis on;                  %显示坐标系

    15.膨胀操作
    I=imread('xian.bmp');          %载入图像
    I1=rgb2gray(I);
    subplot(1,2,1);
    imshow(I1);
    title('灰度图像')      
    axis([50,250,50,200]);
    grid on;                  %显示网格线
    axis on;                  %显示坐标系
    se=strel('disk',1);          %生成圆形结构元素
    I2=imdilate(I1,se);             %用生成的结构元素对图像进行膨胀
    subplot(1,2,2);
    imshow(I2);
    title('膨胀后图像');
    axis([50,250,50,200]);
    grid on;                  %显示网格线
    axis on;                  %显示坐标系

    16.腐蚀操作
    MATLAB实现腐蚀操作
    I=imread('xian.bmp');          %载入图像
    I1=rgb2gray(I);
    subplot(1,2,1);
    imshow(I1);
    title('灰度图像')      
    axis([50,250,50,200]);
    grid on;                  %显示网格线
    axis on;                  %显示坐标系
    se=strel('disk',1);       %生成圆形结构元素
    I2=imerode(I1,se);        %用生成的结构元素对图像进行腐蚀
    subplot(1,2,2);
    imshow(I2);
    title('腐蚀后图像');
    axis([50,250,50,200]);
    grid on;                  %显示网格线
    axis on;                  %显示坐标系

    17.开启和闭合操作
    用MATLAB实现开启和闭合操作
    I=imread('xian.bmp');          %载入图像
    subplot(2,2,1),imshow(I);
    title('原始图像');
    axis([50,250,50,200]);
    axis on;                  %显示坐标系 
    I1=rgb2gray(I);
    subplot(2,2,2),imshow(I1);
    title('灰度图像');
    axis([50,250,50,200]);
    axis on;                  %显示坐标系                   
    se=strel('disk',1);     %采用半径为1的圆作为结构元素
    I2=imopen(I1,se);         %开启操作
    I3=imclose(I1,se);        %闭合操作
    subplot(2,2,3),imshow(I2);
    title('开启运算后图像');
    axis([50,250,50,200]);
    axis on;                  %显示坐标系
    subplot(2,2,4),imshow(I3);
    title('闭合运算后图像');
    axis([50,250,50,200]); 
    axis on;                  %显示坐标系

    18.开启和闭合组合操作
    I=imread('xian.bmp');          %载入图像
    subplot(3,2,1),imshow(I);
    title('原始图像');
    axis([50,250,50,200]);
    axis on;                  %显示坐标系 
    I1=rgb2gray(I);
    subplot(3,2,2),imshow(I1);
    title('灰度图像');
    axis([50,250,50,200]);
    axis on;                  %显示坐标系                   
    se=strel('disk',1);     
    I2=imopen(I1,se);         %开启操作
    I3=imclose(I1,se);        %闭合操作
    subplot(3,2,3),imshow(I2);
    title('开启运算后图像');
    axis([50,250,50,200]);
    axis on;                  %显示坐标系
    subplot(3,2,4),imshow(I3);
    title('闭合运算后图像');
    axis([50,250,50,200]);
    axis on;                  %显示坐标系
    se=strel('disk',1); 
    I4=imopen(I1,se);
    I5=imclose(I4,se);
    subplot(3,2,5),imshow(I5);        %开—闭运算图像
    title('开—闭运算图像');
    axis([50,250,50,200]);
    axis on;                  %显示坐标系 
    I6=imclose(I1,se);
    I7=imopen(I6,se);
    subplot(3,2,6),imshow(I7);        %闭—开运算图像 
    title('闭—开运算图像');
    axis([50,250,50,200]);
    axis on;                  %显示坐标系   

    19.形态学边界提取
    利用MATLAB实现如下:
    I=imread('xian.bmp');          %载入图像
    subplot(1,3,1),imshow(I);
    title('原始图像'); 
    axis([50,250,50,200]);
    grid on;                  %显示网格线
    axis on;                  %显示坐标系
    I1=im2bw(I);
    subplot(1,3,2),imshow(I1);
    title('二值化图像');
    axis([50,250,50,200]);
    grid on;                  %显示网格线
    axis on;                  %显示坐标系
    I2=bwperim(I1);                 %获取区域的周长
    subplot(1,3,3),imshow(I2); 
    title('边界周长的二值图像');
    axis([50,250,50,200]);
    grid on;
    axis on;              

    20.形态学骨架提取
    利用MATLAB实现如下:
    I=imread('xian.bmp');
    subplot(2,2,1),imshow(I);
    title('原始图像');
    axis([50,250,50,200]);
    axis on;                  
    I1=im2bw(I);
    subplot(2,2,2),imshow(I1);
    title('二值图像');
    axis([50,250,50,200]);
    axis on;                 
    I2=bwmorph(I1,'skel',1);
    subplot(2,2,3),imshow(I2);
    title('1次骨架提取');
    axis([50,250,50,200]);
    axis on;                  
    I3=bwmorph(I1,'skel',2);
    subplot(2,2,4),imshow(I3);
    title('2次骨架提取');
    axis([50,250,50,200]);
    axis on;               

    21.直接提取四个顶点坐标
    I = imread('xian.bmp');
    I = I(:,:,1);
    BW=im2bw(I); 
    figure
    imshow(~BW)
    [x,y]=getpts

    展开全文
  • 1.我们主要学习以下四种...% Matlab图像边缘检测梯度算子–Roberts、Prewitt、Sobel、LOG、Canny I = imread('0.jpg'); I =rgb2gray(I); % edge()函数:边缘检测,门限值采用默认值 % Roberts算子边缘检测 BW1=edge(...

    1.我们主要学习以下四种差分算子

    • Roberts算子
    • Sobel算子
    • Prewitt算子
    • canny算子
    %  Matlab图像边缘检测梯度算子–Roberts、Prewitt、Sobel、LOG、Canny
    I = imread('0.jpg');
    I =rgb2gray(I);
    % edge()函数:边缘检测,门限值采用默认值
    % Roberts算子边缘检测
    BW1=edge(I,'roberts');
    % Prewitt算子边缘检测
    BW2=edge(I,'prewitt');
    % Sobel算子边缘检测
    BW3=edge(I,'sobel');
    % LOG算子边缘检测
    BW4=edge(I,'log');
    % Canny算子边缘检测
    BW5=edge(I,'canny');
    
    figure,imshow(BW1,[]);
    figure,imshow(BW2,[]);
    figure,imshow(BW3,[]);
    figure,imshow(BW4,[]);
    figure,imshow(BW5,[]);
    

    2.图像分割原理

    图像分割的研究多年来一直受到人们的高度重视,至今提出了各种类型的分割算法。Pal把图像分割算法分成了6类:阈值分割,像素分割、深度图像分割、彩色图像分割,边缘检测和基于模糊集的方法。但是,该方法中,各个类别的内容是有重叠的。为了涵盖不断涌现的新方法,有的研究者将图像分割算法分为以下六类:并行边界分割技术、串行边界分割技术、并行区域分割技术、串行区域分割技术、结合特定理论工具的分割技术和特殊图像分割技术。而在较近的一篇综述中,更有学者将图像分割简单的分割数据驱动的分割和模型驱动的分割两类。下面将图像分割方法主要分以下几类:基于阈值的分割方法、基于区域的分割方法、基于边缘的分割方法、基于数学形态的分割方法以及基于特定理论的分割方法等,对其中主要的分别进行简要介绍。

    2.1灰度阈值分割法

    是一种最常用的并行区域技术,它是图像分割中应用数量最多的一类。阈值分割方法实际上是输入图像f到输出图像g的如下变换:

     

    其中,T为阈值,对于物体的图像元素g(i,j)=l,对于背景的图像元素g(i,j)=0。

    由此可见,阈值分割算法的关键是确定阈值,如果能确定一个合适的阈值就可准确地将图像分割开来。如果阈值选取过高,则过多的目标区域将被划分为背景,相反如果阈值选取过低,则过多的背景将被划分到目标区[7]。阈值确定后,将阈值与像素点的灰度值比较和像素分割可对各像素并行地进行,分割的结果直接给出图像区域。

    阈值分割必须满足一个假设条件:图像的直方图具有较明显的双峰或多峰,并在谷底选择闭值。因此这种方法对目标和背景反差较大的图像进行分割的效果十分明显,而且总能用封闭、连通的边界定义不交叠的区域。

    阈值分割法主要分为全局和局部两种,目前应用的闭值分割方法都是在此基础上发展起来的,比如最小误差法、最大相关法、最大嫡法、矩量保持法、Otsu最大类间方差法等,而应用最广泛的是Otsu最大类间方差法。

    人们发展了各种各样的阈值处理技术,包括全局阈值、自适应阈值、最佳阈值等等。  全局阈值是指整幅图像使用同一个阈值做分割处理,适用于背景和前景有明显对比的图像。它是根据整幅图像确定的:T=T(f)。但是这种方法只考虑像素本身的灰度值,一般不考虑空间特征,因而对噪声很敏感。常用的全局阈值选取方法有利用图像灰度直方图的峰谷法、最小误差法、最大类间方差法、最大熵自动阈值法以及其它一些方法。在许多情况下,物体和背景的对比度在图像中的各处不是一样的,这时很难用一个统一的阈值将物体与背景分开。这时可以根据图像的局部特征分别采用不同的阈值进行分割。实际处理时,需要按照具体问题将图像分成若干子区域分别选择阈值,或者动态地根据一定的邻域范围选择每点处的阈值,进行图像分割。这时的阈值为自适应阈值。阈值的选择需要根据具体问题来确定,一般通过实验来确定。对于给定的图像,可以通过分析直方图的方法确定最佳的阈值,例如当直方图明显呈现双峰情况时,可以选择两个峰值的中点作为最佳阈值。

    阈值分割的优点是计算简单、运算效率较高、速度快,在算法上容易实现,在重视运算效率的应用场合(如用于硬件实现),它得到了广泛应用。它对目标和背景对比度反差较大图像这种分割很有效, 而且总能用封闭、连通的边界定义不交叠的区域。但它不适用于多通道图像和特征值相关不大的图像,对图像中不存在明显灰度差异或各物体的灰度值范围有较大重叠的图像分割问题难以得到准确结果。另外由于阈值确定主要依赖于灰度直方图, 而很少考虑图像中像素的空间位置关系,因此当背景复杂,特别在是同一背景上重叠出现若干个研究目标时,或图像中噪声信号较多时,目标的灰度值与背景相差无几等情形下,容易丧失部分边界信息,按照固定的阈值进行分割所得到的结果就不准确,造成分割不完整,需要进一步的精确定位。

    2.2基于区域的分割方法

      区域生长和分裂合并法是两种典型的串行区域技术,其分割过程后续步骤的处理要根据前面步骤的结果进行判断而确定。

    (1)区域生长

      区域生长的基本思想是将具有相似性质的像素集合起来构成区域。具体先对每个需要分割的区域找一个种子像素作为生长的起点,然后将种子像素周围邻域中与种子像素有相同或相似性质的像素(根据某种事先确定的生长或相似准则来判定)合并到种子像素所在的区域中。将这些新像素当作新的种子像素继续进行上面的过程,直到再没有满足条件的像素可被包括进来。

    区域生长需要选择一组能正确代表所需区域的种子像素,确定在生长过程中的相似性准则,制定让生长停止的条件或准则。相似性准则可以是灰度级、彩色、纹理、梯度等特性。选取的种子像素可以是单个像素,也可以是包含若干个像素的小区域。大部分区域生长准则使用图像的局部性质。生长准则可根据不同原则制定,而使用不同的生长准则会影响区域生长的过程。

    区域生长法的优点是计算简单,对于较均匀的连通目标有较好的分割效果,对有复杂物体定义的复杂场景的分割或者对自然景物的分割等类似先验知识不足的图像分割, 效果均较理想,Wu H S等提出利用肺部癌细胞图像的均值、标准偏差构成的矢量作为细胞分割的特征, 提出的区域增长分割算法分割肺部癌细胞纹理图像, 取得较好结果[10]。它的缺点是需要人为确定种子点,虽然其抗噪性能优于边缘分割和直方图分割,但仍对噪声敏感,可能导致区域内有空洞;另外,它是一种串行算法,当目标较大时,分割速度较慢,因此在设计算法时,要尽量提高效率;而且在计算过程中引入的预定误差值选取不当时,还会引入误判,易受分析目标内部组织之间的重叠干扰影响。因此,基于区域生长的分割方法一般适合于边缘光滑、无重叠的细胞图象的分割。

    (2)区域分裂合并

    区域生长是从某个或者某些像素点出发,最后得到整个区域,进而实现目标提取。分裂合并差不多是区域生长的逆过程:从整个图像出发,不断分裂得到各个子区域,然后再把前景区域合并,实现目标提取。分裂合并的假设是对于一幅图像,前景区域由一些相互连通的像素组成的,因此,如果把一幅图像分裂到像素级,那么就可以判定该像素是否为前景像素。当所有像素点或者子区域完成判断以后,把前景区域或者像素合并就可得到前景目标。在这类方法中,最常用的方法是四叉树分解法。设R代表整个正方形图像区域,P代表逻辑谓词。基本分裂合并算法步骤如下:

    ①       对任一个区域,如果H(Ri)=FALSE就将其分裂成不重叠的四等份;

    ②       对相邻的两个区域Ri和Rj,它们也可以大小不同(即不在同一层),如果条件H(Ri∪Rj)=TRUE满足,就将它们合并起来。

    ③       如果进一步的分裂或合并都不可能,则结束。  

    分裂合并法的关键是分裂合并准则的设计。这种方法对复杂图像的分割效果较好,但算法较复杂,计算量大,分裂还可能破坏区域的边界。

     2.3基于边缘的分割方法

    图像分割的一种重要途径是通过边缘检测,即检测灰度级或者结构具有突变的地方,表明一个区域的终结,也是另一个区域开始的地方。这种不连续性称为边缘。不同的图像灰度不同,边界处一般有明显的边缘,利用此特征可以分割图像。图像中边缘处像素的灰度值不连续,这种不连续性可通过求导数来检测到。对于阶跃状边缘,其位置对应一阶导数的极值点,对应二阶导数的过零点(零交叉点)。因此常用微分算子进行边缘检测[11]。

    常用的一阶微分算子有Roberts算子、Prewitt算子和Sobel算子,二阶微分算子有Laplace算子和Kirsh算子等。在实际中各种微分算子常用小区域模板来表示,微分运算是利用模板和图像卷积来实现。这些算子对噪声敏感,只适合于噪声较小不太复杂的图像。由于边缘和噪声都是灰度不连续点,在频域均为高频分量,直接采用微分运算难以克服噪声的影响。因此用微分算子检测边缘前要对图像进行平滑滤波。

    Roberts算子有利于对具有陡峭边缘的低噪声图像的分割;laplacian算子具有各向同性的特点;Roberts算子和laplacian算子在实施过程中大大增强了噪声,恶化了信噪比。Prewitt算子、Sobel算子等有利于对具有较多噪声且灰度渐变图像的分割。Log算子和Canny算子是具有平滑功能的二阶和一阶微分算子,边缘检测效果较好。其中Log算子是采用Laplacian算子求高斯函数的二阶导数,Canny算子是高斯函数的一阶导数,它在噪声抑制和边缘检测之间取得了较好的平衡。Marr算法对有较多噪声的图像具有平滑作用,且其边缘检测效果优于以上几种算子,但Marr算法在平滑的同时导致图像对比度下降[7]。Kirch算法利用对梯度图像适当的阈值进行二值化, 使得目标和背景像素点低于阈值, 而大多数边缘点高于阀值, 同时为了提高性能, 在该类算法中可引入分水岭算法以进行准确分割[1]。

    Hough变换法利用图像全局特性而直接检测目标轮廓,将边缘像素连接起来组成区域封闭边界的一种常见方法。在预先知道区域形状的条件下,利用哈夫变换可以方便地得到边界曲线而将不连续的边界像素点连接起来。它的主要优点是受噪声和曲线间断的影响较小。

    对于灰度变化复杂和细节较丰富图象,边缘检测算子均很难完全检测出边缘,而且一旦有噪声干扰时,上述算子直接处理效果更不理想。这一方法用来分割显微图象的例子不多,因为显微图象中的许多纹理或颗粒会掩盖真正的边缘,虽然可以通过有关算法改进,但效果并不太好。

    拟合算子( 即参数模型匹配算法)原理:用边缘的参数模型对图像的局部灰度值进行拟合, 再在拟合的参数模型上进行边缘检测。优缺点:此类算子在检测边缘的同时, 还平滑了噪声, 对有较大噪声和高纹理细胞图像处理效果较好, 但由于参数模型记录着更多的边缘结构信息, 计算开销很大, 算法复杂, 而且对边缘类型要求较高。

    以上三种方法中,基于边缘分割的最常见的问题是在没有边界的地方出现了边缘以及在实际存在边界的地方没有出现边界, 这是由图像噪声或图像中的不适合的信息造成的[24]。基于区域增长方法分割后的图像,时常是由于参数的设置非最优性造成, 不是含有太多的区域就是含有过少的区域。阈值化是最简单的分割处理, 计算代价小, 速度快, 用一个亮度常量即阈值来分割物体和背景。

    3. 图像分割的实现

    我用了Roberts算子、Sobel算子和Kirsh算子边缘检测的方法但都由于亮度不均等因素对图像分割的效果不太好。

    (1)Roberts算子

    G[F(x,y)]=|F(x,y)−F(x+1,y)|+|F(x,y)−F(x,y+1)|
    G[F(x,y)]=|F(x,y)−F(x+1,y)|+|F(x,y)−F(x,y+1)|

          Roberts算子涉及绝对值运算,我们不方便提取出模版来做模版卷积运算,那么直接遍历所有点求出其近似梯度幅值。Roberts边缘检测算子根据任意一对互相垂直方向上的差分可用来计算梯度的原理,采用对角线方向相邻两像素之差。

    MATLAB实验代码如下:

    clear;
    sourcePic=imread('lena.jpg'); %读取原图像
    grayPic=mat2gray(sourcePic); %实现图像矩阵的归一化操作
    [m,n]=size(grayPic);
    newGrayPic=grayPic;%为保留图像的边缘一个像素
    robertsNum=0; %经roberts算子计算得到的每个像素的值
    robertThreshold=0.2; %设定阈值
    for j=1:m-1 %进行边界提取
        for k=1:n-1
            robertsNum = abs(grayPic(j,k)-grayPic(j+1,k+1)) + abs(grayPic(j+1,k)-grayPic(j,k+1));
            if(robertsNum > robertThreshold)
                newGrayPic(j,k)=255;
            else
                newGrayPic(j,k)=0;
            end
        end
    end
    figure,imshow(newGrayPic);
    title('roberts算子的处理结果')

    边界点无法按照Roberts算子求交叉差分,这里采取直接忽略边界的方式。需要注意的是把类型强制转换为uint8(abs默认返回double)。

    (2)Sobel算子


    Roberts算子是基于2*2窗口计算近似梯度,而Sobel算子是基于3*3窗口计算近似梯度的,并且Sobel算子并不是各向同性的算子,它分为:

    水平边缘检测Sobel算子gx
    垂直边缘检测Sobel算子gy
    先给出模版再说明近似梯度的原因: 
    gx=⎡⎣⎢−1 0 1−202−101⎤⎦⎥
    gx=[−1−2−1 000 121]
    gy=⎡⎣⎢−1 −2 −1000121⎤⎦⎥
    gy=[−101 −202 −101]
    gxgx之所以近似表示水平梯度,是因为它直接求的是3*3窗口内模版中心像素点附近的像素点水平差分之和,中间元素差分乘以了权重系数2表示和模版中心关联度更高。gygy可以类似理解。

    对数字图像的每个像素,考察它上、下、左、右邻点灰度的加权差,与之接近的邻点的权大。 

    运用模版卷积运算,可以快速求出水平梯度: 
    Gx=gx⋅F3×3
    Gx=gx⋅F3×3
    Sobel算子考虑权重,因此抗噪能力优于无权重的Prewitt算子(见后)。

    在求出了水平梯度GxGx和垂直梯度GyGy后,可以得到梯度幅值为: 
    G=(Gx)2+(Gy)2−−−−−−−−−−−√
    G=(Gx)2+(Gy)2
     

    MATLAB实验代码如下:

    clear;
    sourcePic=imread('lena.jpg');%读取原图像
    grayPic=mat2gray(sourcePic);%实现图像矩阵的归一化操作
    [m,n]=size(grayPic);
    newGrayPic=grayPic;%为保留图像的边缘一个像素
    sobelNum=0;%经sobel算子计算得到的每个像素的值
    sobelThreshold=0.8;%设定阈值
    for j=2:m-1 %进行边界提取
        for k=2:n-1
            sobelNum=abs(grayPic(j-1,k+1)+2*grayPic(j,k+1)+grayPic(j+1,k+1)-grayPic(j-1,k-1)-2*grayPic(j,k-1)-grayPic(j+1,k-1))+abs(grayPic(j-1,k-1)+2*grayPic(j-1,k)+grayPic(j-1,k+1)-grayPic(j+1,k-1)-2*grayPic(j+1,k)-grayPic(j+1,k+1));
            if(sobelNum > sobelThreshold)
                newGrayPic(j,k)=255;
            else
                newGrayPic(j,k)=0;
            end
        end
    end
    figure,imshow(newGrayPic);
    title('Sobel算子的处理结果')

    为了节约运算量,一般在实现Sobel算子时不直接使用求模运算(平方和再开方),而是比较GxGx和GyGy中绝对值较大者(水平差分和垂直差分较大者),也就是选取边界轮廓更加明显的方向。

    使用模版卷积,直接忽略边界:

    function [ edge ] = SobelOperator( pic )
        edge = uint8(zeros(size(pic)));
    
        h = size(pic, 1);
        w = size(pic, 2);
    
        gx = [-1, -2, -1; 0, 0, 0; 1, 2, 1];
        gy = gx';
    
        for i = 2 : h - 1
            for j = 2 : w - 1
                sub = double(pic(i - 1 : i + 1, j - 1 : j + 1));
                g1 = abs(sum(sum(sub .* gx)));
                g2 = abs(sum(sum(sub .* gy)));
                if g1 > g2
                    edge(i, j) = uint8(g1);
                else
                    edge(i, j) = uint8(g2);
                end
            end
        end
    end

    相比Roberts算子,使用Sobel算子得到的边缘线条更粗,但能一定程度上反映边缘在原始图像中的强度。
    还是需要注意:做卷积时用Matlab点乘
    uint8类型转换
    (3)运行结果

    (3)Prewitt算子

    前面提到过,Prewitt是Sobel算子的无权重版本,模版如下: 
    gx=⎡⎣⎢−1 0 1−101−101⎤⎦⎥
    gx=[−1−1−1 000 111]
    gy=⎡⎣⎢−1 −1 −1000111⎤⎦⎥
    gy=[−101 −101 −101]

    MATLAB实验代码:

    clear;
    sourcePic=imread('lena.jpg');%读取原图像
    grayPic=mat2gray(sourcePic);%实现图像矩阵的归一化操作
    [m,n]=size(grayPic);
    newGrayPic=grayPic;%为保留图像的边缘一个像素
    PrewittNum=0;%经Prewitt算子计算得到的每个像素的值
    PrewittThreshold=0.5;%设定阈值
    for j=2:m-1 %进行边界提取
        for k=2:n-1
            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));
            if(PrewittNum > PrewittThreshold)
                newGrayPic(j,k)=255;
            else
                newGrayPic(j,k)=0;
            end
        end
    end
    figure,imshow(newGrayPic);
    title('Prewitt算子的处理结果')

    直接修改模版即可:

        gx = [-1, -1, -1; 0, 0, 0; 1, 1, 1];
        gy = gx';

    运行结果:
    Prewitt算子边缘检测和Sobel算子结果相似,但不如其细节丰富。Prewitt算子是一种边缘样板算子。这些算子样板由理想的边缘子图像构成。依次用边缘样板去检测图像,与被检测区域最为相似的样板给出最大值。 

    (4)Canny算子

           边缘检测中的算子主要是canny来作为标准行业边缘检测方式

           Canny算子是John F.Canny于1986年开发出来的一个多级边缘检测算法。虽然算法比较复杂,但本节讨论的Canny边缘检测器(Canny[1986])的性能是一般优于目前讨论的边缘检测器。Canny的方法,给出了评价边缘检测性能优劣的三个指标:

    1. 较低的错误率。应该找到所有的边,并且不应该有虚假的响应。
    2. 边缘点应该很好地本地化。定位的边缘必须尽可能接近真实的边缘,也就是距离;
    3. 在被检测器标记为边缘的点与真实边缘的中心之间应该是最小的。

     具体来说Canny边缘检测算法可分为以下几个步骤:     

              step1:用高斯滤波器平滑图象;     
              step2:用一阶偏导的有限差分来计算梯度的幅值和方向;     
              step3:对梯度幅值进行非极大值抑制;     
              step4:用双阈值算法检测和连接边缘。

                

    主要是四个步骤的实现:

    image 单通道输入图像
    edges 单通道存储边缘的输出图像
    threshold1 第一个阈值
    threshold2 第二个阈值

     

    Canny函数 采用 CANNY 算法发现输入图像的边缘而且在输出图像中标识这些边缘。

    threshold1和threshold2 当中的小阈值用来控制边缘连接,大的阈值用来控制强边缘的初始分割。

     


    其他相关文章请点击:

    图像算法一:【图像点运算】灰度直方图、伽马变换、灰度阈值变换、分段线性变换、直方图均衡化

    图像算法二:【图像几何变换】平移、镜像、转置、缩放、旋转、插值

    图像算法三:【图像增强--空间域】图像平滑、中值滤波、图像锐化

    图像算法四:【图像增强--频率域】傅里叶变换、快速傅里叶变换、频域滤波、频域低通滤波、频域高通滤波

    图像算法五:【图像小波变换】多分辨率重构、Gabor滤波器、Haar小波

    图像算法六:【彩色图像处理】彩色模型、彩图处理

    图像算法七:【形态学图像处理】二值运算、膨胀、腐蚀

    图像算法八:【图像分割】边缘检测(Roberts,Sobel,canny)、霍夫变换(hough)、阈值分割、区域分割

    图像算法九:【图像特征提取】特征降维、PCA人脸特征抽取、局部二进制

    ~~~~

    展开全文
  • 1.图像边缘检测 图像边缘检测:实质是对图像进行卷积运算。 实现canny边缘检测步骤: 转换为灰度图 进行高斯滤波 canny方法实现边缘检测 调用api实现canny边缘检测,测试代码如下: 1 import cv2 ...

    1.图像边缘检测

    图像的边缘检测:实质是对图像进行卷积运算。

    实现canny边缘检测步骤:

    1. 转换为灰度图
    2. 进行高斯滤波
    3. canny方法实现边缘检测 

     调用api实现canny边缘检测,测试代码如下:

     1 import cv2
     2 import numpy as np
     3 import random
     4 img = cv2.imread('image0.jpg', 1)
     5 imgInfo = img.shape
     6 height = imgInfo[0]
     7 width = imgInfo[1]
     8 cv2.imshow('src',img)
     9 # 转化为灰度图
    10 gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    11 # 高斯滤波 模板大小为3*3
    12 imgG = cv2.GaussianBlur(gray,(3,3),0)
    13 # 调用canny方法 设置门限 大于门限则为边缘点
    14 dst = cv2.Canny(img,50,50)
    15 cv2.imshow('dst',dst)
    16 cv2.waitKey(0)

    运行结果如下:

    src为原始图像:

    dst为边缘检测处理后的图像:

    手动实现图像边缘检测算法,以及相应的优化,测试代码如下:

     1 import cv2
     2 import numpy as np
     3 import random
     4 import math
     5 img = cv2.imread('image2.jpg', 1)
     6 imgInfo = img.shape
     7 height = imgInfo[0]
     8 width = imgInfo[1]
     9 cv2.imshow('src',img)
    10 # sobel
    11 # 1 算子模板 第一个为y方向上的 第二个为x方向的
    12 # [ 1  2  1     [1 0 -1]
    13 #   0  0  0      2 0 -2
    14 #  -1 -2 -1]     1 0 -1]
    15 # 2 图片卷积
    16 # [1 2 3 4][a b c d] a*1+b*2+c*3+d*4 = dst
    17 # 3 阈值判决
    18 # sqrt(a*a+b*b) = f>th
    19 gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    20 dst = np.zeros((height,width,1),np.uint8)
    21 for i in range(0,height-2):
    22     for j in range(0,width-2):
    23         # y方向上的梯度
    24         # gy = gray[i,j]*1+gray[i,j+1]*2+gray[i,j+2]*1-gray[i+2,j]*1-gray[i+2,j+1]*2-gray[i+2,j+2]*1
    25         # 优化 y方向上的梯度
    26         gy = gray[i,j]+(gray[i,j+1]<<1)+gray[i,j+2]-gray[i+2,j]-(gray[i+2,j+1]<<1)-gray[i+2,j+2]
    27         # x方向上的梯度
    28         # gx = gray[i,j]*1+gray[i+1,j]*2+gray[i+2,j]*1-gray[i,j+2]*1-gray[i+1,j+2]*2-gray[i+2,j+2]*1
    29         # 优化 x方向上的梯度
    30         gx = gray[i,j]+(gray[i+1,j]<<1)+gray[i+2,j]-gray[i,j+2]-(gray[i+1,j+2]<<1)-gray[i+2,j+2]
    31         # 梯度
    32         grad = math.sqrt(int(gx*gx+gy*gy))
    33         # 判断是否超过阈值
    34         if grad > 50:
    35             dst[i,j] = 255
    36         else:
    37             dst[i,j] = 0
    38 cv2.imshow('dst',dst)
    39 cv2.waitKey(0)

    运行结果如下:

    src为初始图像:

    dst为边缘检测处理后的图像:

    2.浮雕效果

    浮雕效果:newP = gray0-gray1+150(特定值) 即当前像素等于相邻像素之差再加上一个特定值突出灰度 即边缘特征,设定不同的特征值的时候会出现不同的浮雕效果。
    测试代码如下:

     1 import cv2
     2 import numpy as np
     3 import random
     4 img = cv2.imread('image0.jpg', 1)
     5 imgInfo = img.shape
     6 height = imgInfo[0]
     7 width = imgInfo[1]
     8 cv2.imshow('src',img)
     9 # 转化为灰度图
    10 gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    11 dst = np.zeros((height,width,1),np.uint8)
    12 for i in range(0,height):
    13     for j in range(0,width-1):
    14         grayP0 = int(gray[i,j])
    15         grayP1 = int(gray[i,j+1])
    16         newP = grayP0-grayP1+50
    17         if newP > 255:
    18             newP = 255
    19         if newP < 0:
    20             newP = 0
    21         dst[i,j] = newP
    22 cv2.imshow('dst',dst)
    23 cv2.waitKey(0)

    运行结果如下:

    src初始图像:

    dst浮雕效果图像:(特定值为150的时候)

    dst浮雕效果图像:(特定值为50的时候)

    3.颜色映射

    颜色映射按照我的理解就是一个颜色对应上另一个颜色,比如蓝色对应红色,那么一副纯蓝色的图像就会被映射为一副纯红色的图像。

    颜色映射的实现方法:可以建立一张颜色映射表,另外一种简单的方法是对rgb分别乘上一个系数,以下面实现一个“蓝色效果”为例,b=b*1.5 g=g*1.3 r=r,测试代码如下:

     1 import cv2
     2 import numpy as np
     3 import random
     4 img = cv2.imread('image0.jpg', 1)
     5 imgInfo = img.shape
     6 height = imgInfo[0]
     7 width = imgInfo[1]
     8 cv2.imshow('src',img)
     9 dst = np.zeros((height,width,3),np.uint8)
    10 for i in range(0,height):
    11     for j in range(0,width):
    12         (b,g,r) = img[i,j]
    13         b = b * 1.5
    14         g = g * 1.3
    15         # 防止越界操作
    16         if b > 255:
    17             b = 255
    18         if g > 255:
    19             g = 255
    20         dst[i,j] = (b,g,r)
    21 cv2.imshow('dst',dst)
    22 cv2.waitKey(0)

    运行结果如下:

    src为初始图像:

    dst为蓝色效果图像:

    4.油画特效

    油画特效
    1 gray
    2 统计方块中的灰度值
    3 对灰度值进行分段
    4 对灰度值取平均作为结果

    测试代码如下:

     1 import cv2
     2 import numpy as np
     3 import random
     4 img = cv2.imread('Jerry.jpg', 1)
     5 imgInfo = img.shape
     6 height = imgInfo[0]
     7 width = imgInfo[1]
     8 cv2.imshow('src',img)
     9 # 灰度化
    10 gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    11 dst = np.zeros((height,width,3),np.uint8)
    12 for i in range(4,height-4):
    13     for j in range(4,width-4):
    14         array1 = np.zeros(8,np.uint8)
    15         for m in range(-4,4):
    16             for n in range(-4,4):
    17                 p1 = int(gray[i+m,j+n]/32)
    18                 array1[p1] = array1[p1]+1
    19         currentMax = array1[0]
    20         l = 0
    21         for k in range(0,8):
    22             if currentMax < array1[k]:
    23                 currentMax = array1[k]
    24                 l=k
    25         for m in range(-4,4):
    26             for n in range(-4,4):
    27                 if gray[i+m,j+n] >= (l*32) and gray[i+m,j+n] <= ((l+1)*32):
    28                     (b,g,r) = img[i+m,j+n]
    29         dst[i,j] = (b,g,r)
    30 cv2.imshow('Jerry',dst)
    31 cv2.waitKey(0)

    运行结果如下:

    src为原始图像:

    Jerry是处理后的图像:

     

    转载于:https://www.cnblogs.com/shixinzei/p/10899102.html

    展开全文
  • 霍夫变换是图像处理中从图像中识别几何形状的基本方法之一,应用很广泛,也有很多改进算法。主要用来从图像中分离出具有某种相同特征的几何形状(如,直线,等)。 python实现 import cv2 import numpy as np...
  • )[+]一数字图像基础二数字图像存储与显示三图像变换四形态学图像处理五图像边缘检测六图像增强和复原七图像压缩八图像分割九图像特征提取与匹配wq11十图像分类识别站得高,才能看得远!花了点时间整理了一下数字图像...
  • 图像处理与识别学习小结 数字图像处理是对图像进行分析、加工、和处理,使其满足视觉、心理以及其他要求的技术。图像处理是信号处理在图像域上的一个应用。目前大多数的图像是以数字形式存储,因而图像处理很多情况...
  • 数字图像处理基础

    2018-09-23 20:27:05
    文章目录数字图像处理数字图像基础图像内插 数字图像处理 数字图像基础 图像内插 用于图像放大、缩小、旋转、几何校正等任务。首先确定变换前后的坐标对应关系,用src表示转换前的图像尺寸,dst表示转换后的图像...
  • 数字图像处理数字图像处理 一学习内容总结 第一章 绪论 1 什么是数字图像处理 2 使用数字图像处理领域的实例 3 数字图像处理的基本步骤 4 图像处理系统的组成 第二章 数字图像处理基础 1 视觉感知要素 2 光和电磁...
  • 先对原始图像进行相位一致性边缘检测并细化处理,得到包含裂隙特征和伪边缘的分段线,再根据距离和角度原则对分段线迭代连接,裂隙分段线相互连接而不断完整的同时滤除不能连接而变长的伪边缘。实验表明,对于大体积...
  • 《数字图像处理-冈萨雷斯》笔记第一章 绪论图像处理实例:伽马射线成像、X射线成像、紫外波段成像、可见光以及红外线成像、微波波段成像、无线电波成像、声波成像。图像处理的基本步骤:图像获取、滤波与增强、图像...
  • 红外图像处理

    2014-03-04 13:55:52
    红外图像处理一般区别于普通可见光的红外处理算法,虽然种类和流程接近,但是具体时间是要有不少的区别的。红外图像一般由于成像芯片的制作工艺问题产生分均匀现象,具体就是指相同输入产生不同的输出。零输入情况下...
  • 本文在撰写过程中参考了由何东健教授主编、西安电子科技大学出版社出版的《数字图像处理》(第三版),一切著作权归原书作者和出版社所有。特别感谢长安大学软件系老师的认真负责的教导。 第1章 概论 1.1 数字...
  • 图像处理与识别

    2017-03-23 09:45:57
    数字图像处理是对图像进行分析、加工、和处理,使其满足视觉、心理以及其他要求的技术。图像处理是信号处理在图像域上的一个应用。目前大多数的图像是以数字形式存储,因而图像处理很多情况下指数字图像处理。此外,...
  • MATLAB图像处理

    2020-01-15 10:56:46
    介绍MATLAB提供的图像处理功能,包括图像基础知识、图像合成、空间变换、邻域和块处理、局部滤波、正交变换、数学形态学、图像分析、图像增强、图像恢复、图像分割、图像配准和图像三维重建等内容。
1 2 3 4 5 ... 20
收藏数 2,224
精华内容 889