zoukankan      html  css  js  c++  java
  • 梯度

    梯度不只一种计算公式!不同的方法产生不同的梯度,如采用线性滤波方法,或采用形态学梯度方法……

    梯度定义:

    梯度
    (1)采用线性滤波方法求梯度
    直接按照上述定义。不过“计算梯度的关键问题之一是如何数字化地估计Gx和Gy”,有几种经典的估计方法,如Sobel、Prewitt、Roberts,以Sobel方法为例,它提供了两个3x3矩阵:

    梯度

    (图 *)


    这两个矩阵的作用是:将上述定义的Gx、Gy代入振幅计算公式近似计算梯度。它提供了一种方式。

    注意到,h和h'是互为转置。而且可以用如下方式产生:

    >> h=fspecial('sobel')
    h =
         1     2     1
         0     0     0
        -1    -2    -1

    这正是线性空间滤波时用到的滤波模板,它“近似为一个垂直的梯度”,用于检测水平边缘。

    于是可以看到,滤波、边缘检测、梯度,是有内在联系的。

    边缘检测使用的语法为:

     [g,t]=edge(f,'sobel');

    g便是被检测到的边缘(边缘处为1其它地方为0的二值图像),edge函数的执行过程为:使用h对图像进行滤波(使用imfilter函数),再使用h'对图像进行滤波,然后计算每个滤波后的图像中的像素值的平方,并将两幅图像的结果相加,最后计算相加结果的平方根——此即对振幅公式的解释。

    可以看到,edge函数只是将这些操作封装到一个函数调用中。谈到imfilter,它要用到fspecial等产生模板(掩膜)的函数,这些都是线性空间滤波的内容(参之前的博文笔记)。

    于是,梯度有如下数字计算公式:

    梯度

    一个示例(这个示例在标记控制分水岭算法中有用到):

    f=imread('rice_tophat.png');

    h=fspecial('sobel');%产生Sobel模板

    fd=double(f);%将图像转换为double类

    g=sqrt(imfilter(fd,h,'replicate').^2+imfilter(fd,h','replicate').^2);%计算梯度

    L=watershed(g);%执行分水岭变换

    wr=L==0;%分水岭脊线

    ……

    (2)形态学梯度

    //在“灰度图像形态学膨胀与腐蚀”一文中第(3)步有提到,即:灰度图像的膨胀减去腐蚀的结果便产生一个形态学梯度,如:

    se=strel('square',3)
    gd=imdilate(f,se);
    ge=imerode(f,se);
    gr=gd-ge;%gr便是一个形态学梯度

    =========对于梯度的理解=======

    ①[转自百度知道]

    可以把图像看成二维离散函数,图像梯度其实就是这个二维离散函数的求导:
    图像梯度: G(x,y) = dx i + dy j;
    dx(i,j) = I(i+1,j) - I(i,j);
    dy(i,j) = I(i,j+1) - I(i,j);
    其中,I是图像像素的值(如:RGB值),(i,j)为像素的坐标。
    图像梯度一般也可以用中值差分:
    dx(i,j) = [I(i+1,j) - I(i-1,j)]/2;
    dy(i,j) = [I(i,j+1) - I(i,j-1)]/2;

    图像边缘一般都是通过对图像进行梯度运算来实现的。
    上面说的是简单的梯度定义,其实还有更多更复杂的梯度公式。

    ②[如下为一个梯度计算的小程序]

    %%图像梯度
    f = imread('rice.png');
    f = double(f);
    fGrad = f(2:end,2:end) - f(1:end-1,1:end-1);
    fGrad = fGrad.*fGrad;
    fGrad = sqrt(double(fGrad));
    fGrad(:,end+1) = fGrad(:,end); %梯度图补足边缘
    fGrad(end+1,:) = fGrad(end,:);

    %%梯度阈值设定
     T = 13;
     fGrad(fGrad<T) = 0;
    %%*********显示梯度图
     mfg = max(fGrad(:));
     nfg = min(fGrad(:));
     tFG = uint8(fGrad*255/(mfg - nfg));
     figure,imshow(tFG);

    原图像为:

    梯度

    计算的梯度图像为:

    梯度

    ③“到目前为止,边缘检测最通用的方法是检测亮度值的不连续性。这样的不连续性是用一阶和二阶导数来检测的。而图像处理中选择的一阶导数即梯度,二阶导数通常用拉普拉斯算子来计算”[Conzalez]

    ④梯度是一个向量,它的基本属性是:它指向图像f在坐标(x,y)处的最大变化率方向。最大变化率出现时的角度由α(x,y)给出。按惯例,用于计算梯度的导数用一幅图像中的一个小邻域上的像素值的差来近似。如,对于(图 *),垂直方向的梯度用Gx给出,水平梯度用Gy给出。

    ⑤求出的梯度作为边缘检测的一个判别准则。

    边缘检测的基本意图是使用如下两个基本准则之一在图像中找到亮度快速变化的地方:A找到亮度的一阶导数(即梯度)比指定阈值大的地方;B找到亮度的二阶导数有零交叉的地方。对于A:如果像素(x,y)处梯度≥阈值T,则此点被当作边缘(输出二值图像的对应像素被置1),否则不是。

    ⑥Sobel、Priwitt、Roberts、LoG、Canny即是滤波模板,又可以称作导数估计器——不管是滤波还是求梯度还是边缘检测,最基本的知识是线性空间的卷积操作(这是基础)。

    ⑦“标量函数f(x,y)的梯度是一个在坐标(x,y)处f的最大变化率的方向上的向量”。同④

    ⑧彩色图像的梯度操作有点复杂,但结构与处理二维灰度图像有些相似。具体参colorgrad函数,注重理解向量梯度(Vector Gradient)和求和梯度(PPG,或者说合成梯度)。

  • 相关阅读:
    springboot 梳理2--配置druid数据源
    springboot 梳理1--简单整合mybatis
    springmvc 梳理13--@RequestBody 和 @ResponseBody
    springmvc 梳理12--拦截器
    springmvc 梳理11--restful
    如何快速成长为技术大牛?阿里资深技术专家的总结亮了
    一句话+一张图理解——数据结构与算法
    .net 开发人员的瓶颈和职业发展
    c# 对象相等性和同一性
    c# 连等的写法都做了什么?
  • 原文地址:https://www.cnblogs.com/awishfullyway/p/6593138.html
Copyright © 2011-2022 走看看