zoukankan      html  css  js  c++  java
  • 每天进步一点点------Sobel算子(1)

    void MySobel(IplImage* gray, IplImage* gradient)
    {
    /* Sobel template
    a00 a01 a02
    a10 a11 a12
    a20 a21 a22
    */
    unsigned char a00, a01, a02;
    unsigned char a10, a11, a12;
    unsigned char a20, a21, a22;
    CvScalar color ;
    for (int i=1; i<gray->height-1; ++i)
    {
    for (int j=1; j<gray->width-1; ++j)
    {
    a00 = cvGet2D(gray, i-1, j-1).val[0];
    a01 = cvGet2D(gray, i-1, j).val[0];
    a02 = cvGet2D(gray, i-1, j+1).val[0];
    a10 = cvGet2D(gray, i, j-1).val[0];
    a11 = cvGet2D(gray, i, j).val[0];
    a12 = cvGet2D(gray, i, j+1).val[0];
    a20 = cvGet2D(gray, i+1, j-1).val[0];
    a21 = cvGet2D(gray, i+1, j).val[0];
    a22 = cvGet2D(gray, i+1, j+1).val[0];
    // x方向上的近似导数
    double ux = a20 * (1) + a21 * (2) + a22 * (1)
    + (a00 * (-1) + a01 * (-2) + a02 * (-1));
    // y方向上的近似导数
    double uy = a02 * (1) + a12 * (2) + a22 * (1)
    + a00 * (-1) + a10 * (-2) + a20 * (-1);
    color.val[0] = sqrt(ux*ux + uy*uy);
    cvSet2D(gradient, i, j, color);
    }
    }
    }
    //注释:该程序需要在安装Opencv软件下运行。

    索贝尔算子(Sobel operator)是图像处理中的算子之

    一,主要用作边缘检测。在技术上,它是一离散性差分算子,用来运算图像亮度函数的梯度之近似值。在图像的任何一点使用此算子,将会产生对应的梯度矢量或是其法矢量

    该算子包含两组3x3的矩阵,分别为横向及纵向,将之与图像作平面卷积,即可分别得出横向及纵向的亮度差分近似值。如果以A代表原始图像,Gx及Gy分别代表经横向及纵向边缘检测的图像,其公式如下:

     

    图像的每一个像素的横向及纵向梯度近似值可用以下的公式结合,来计算梯度的大小。
     
    然后可用以下公式计算梯度方向。
     
    在以上例子中,如果以上的角度Θ等于零,即代表图像该处拥有纵向边缘,左方较右方暗。
    在边缘检测中,常用的一种模板是Sobel 算子。Sobel 算子有两个,一个是检测水平边缘的 ;另一个是检测垂直边缘的 。与Prewitt算子相比,Sobel算子对于象素的位置的影响做了加权,可以降低边缘模糊程度,因此效果更好。
    Sobel算子另一种形式是各向同性Sobel(Isotropic Sobel)算子,也有两个,一个是检测水平边缘的 ,另一个是检测垂直边缘的 。各向同性Sobel算子和普通Sobel算子相比,它的位置加权系数更为准确,在检测不同方向的边沿时梯度的幅度一致。将Sobel算子矩阵中的所有2改为根号2,就能得到各向同性Sobel的矩阵。
    由于Sobel算子是滤波算子的形式,用于提取边缘,可以利用快速卷积函数, 简单有效,因此应用广泛。美中不足的是,Sobel算子并没有将图像的主体与背景严格地区分开来,换言之就是Sobel算子没有基于图像灰度进行处理,由于Sobel算子没有严格地模拟人的视觉生理特征,所以提取的图像轮廓有时并不能令人满意。 在观测一幅图像的时候,我们往往首先注意的是图像与背景不同的部分,正是这个部分将主体突出显示,基于该理论,我们给出了下面阈值化轮廓提取算法,该算法已在数学上证明当像素点满足正态分布时所求解是最优的。
    ps=imread('D:14.jpg'); %读取图像
    subplot(1,3,1)
    imshow(ps);
    title('原图像');
    ps=rgb2gray(ps);
    [m,n]=size(ps); %用Sobel微分算子进行边缘检测
    pa = edge(ps,'sobel');
    subplot(1,3,2);
    imshow(pa);
    title('Sobel边缘检测得到的图像');
     
     
     
  • 相关阅读:
    多表联合查询,利用 concat 模糊搜索
    order by 中利用 case when 排序
    Quartz.NET 3.0.7 + MySql 动态调度作业+动态切换版本+多作业引用同一程序集不同版本+持久化+集群(一)
    ASP.NET Core 2.2 基础知识(十八) 托管和部署 概述
    ASP.NET Core 2.2 基础知识(十七) SignalR 一个极其简陋的聊天室
    ASP.NET Core 2.2 基础知识(十六) SignalR 概述
    ASP.NET Core 2.2 基础知识(十五) Swagger
    ASP.NET Core 2.2 基础知识(十四) WebAPI Action返回类型(未完待续)
    linux磁盘管理 磁盘查看操作
    linux磁盘管理 文件挂载
  • 原文地址:https://www.cnblogs.com/kongqiweiliang/p/3245518.html
Copyright © 2011-2022 走看看