sobel算子 - sophia_hxw - 博客园http://www.cnblogs.com/sophia-hxw/p/6088035.html

#1,个人理解

网上查了很多资料,都说sobel算子是用来检测边缘的,分别给了两个方向上的卷积核,然后说明做法,就说这就是sobel算子。对于我个人来说,还有很多不明白的地方,所以理清下思路。

#2,边缘、边界和sobel算子

这个可以自己去google或者百度找定义,边缘边界不一样,两者没有必然联系也并非毫无联系。因为现实世界的三维空间映射到图像显示的二维空间中会丢失很多信息,也会添进来一部分类似光照、场景等的干扰,所以并不能完全给边缘和边界的关系下一个定义。对图像而言,我们一般是要找出它的边缘,因为这是图像处理中使用较多的一个特征。何为边缘?图像处理中认为,灰度值变化剧烈的地方就是边缘。那么如何判断灰度值变化?如何度量“剧烈”?sobel算子就对这些问题做了自己的规范,而且命名为sobel算子,就是对一副图像的输入到输出边缘信息的整个处理过程。

sobel算子的思想,Sobel算子认为,邻域的像素对当前像素产生的影响不是等价的,所以距离不同的像素具有不同的权值,对算子结果产生的影响也不同。一般来说,距离越远,产生的影响越小。

sobel算子的原理,对传进来的图像像素做卷积,卷积的实质是在求梯度值,或者说给了一个加权平均,其中权值就是所谓的卷积核;然后对生成的新像素灰度值做阈值运算,以此来确定边缘信息。

#3,卷积核及计算方法

若Gx是对原图x方向上的卷积,Gy是对原图y方向上的卷积;

原图中的作用点像素值通过卷积之后为:

可以简化成:

比如,一下矩阵为原图中的像素点矩阵,带入上式中的A,最终得到的G或者|G|是下面(x,y)处的像素值,可以自己去搜索下卷积的含义来理解。

另外,卷积核也可以旋转,用与查找不与x,y轴平行或垂直的方向上的边缘。

#4,阈值处理及平滑处理

得到像素点新的像素值之后,给定一个阈值就可以得到sobel算子计算出的图像边缘了。

通常,为了消除噪声对sobel算子的影响,会增加一个预处理的操作,主要是做平滑处理降低噪声的影响。

#5,matlab代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Gx=[1.0 2.0 1.0;0.0 0.0 0.0;-1.0 -2.0 -1.0];
Gy=[-1.0 0.0 1.0;-2.0 0.0 2.0;-1.0 0.0 1.0];
 
img=imread('qiaoba.jpg');
image=rgb2gray(img);
 
subplot(2,2,1);  
imshow(image);   
title('原图');  
 
gradx=conv2(Gx,image,'full'); 
gradx=abs(gradx); %计算图像的sobel垂直梯度 
subplot(2,2,2); 
imshow(gradx,[]); 
title('图像的sobel垂直梯度');
 
grady=conv2(Gy,image,'full'); 
grady=abs(grady); %计算图像的sobel水平梯度 
subplot(2,2,3); 
imshow(grady,[]); 
title('图像的sobel水平梯度'); 
 
grad=gradx+grady;  %得到图像的sobel梯度 
subplot(2,2,4); 
imshow(grad,[]); 
title('图像的sobel梯度');

处理结果:

#5,c++代码实现

来源:http://blog.csdn.net/dcrmg/article/details/52280768

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include "core/core.hpp"   
#include "highgui/highgui.hpp"   
#include "imgproc/imgproc.hpp"   
#include "iostream" 
 
using namespace std;
using namespace cv;
 
int main(int argc, char *argv[])
{
    Mat image = imread("qiaoba.jpg", 0);
    Mat imageX = Mat::zeros(image.size(), CV_16SC1);
    Mat imageY = Mat::zeros(image.size(), CV_16SC1);
    Mat imageXY = Mat::zeros(image.size(), CV_16SC1);
    Mat imageX8UC;
    Mat imageY8UC;
    Mat imageXY8UC;
    if (!image.data)
    {
        return -1;
    }
    GaussianBlur(image, image, Size(3, 3), 0); //高斯滤波消除噪点 
    uchar *P = image.data;
    uchar *PX = imageX.data;
    uchar *PY = imageY.data;
    int step = image.step;
    int stepXY = imageX.step;
    for (int i = 1; i<image.rows - 1; i++)
    {
        for (int j = 1; j<image.cols - 1; j++)
        {
            //通过指针遍历图像上每一个像素 
            PX[i*imageX.step + j*(stepXY / step)] = abs(P[(i - 1)*step + j + 1] + P[i*step + j + 1] * 2 + P[(i + 1)*step + j + 1] - P[(i - 1)*step + j - 1] - P[i*step + j - 1] * 2 - P[(i + 1)*step + j - 1]);
            PY[i*imageX.step + j*(stepXY / step)] = abs(P[(i + 1)*step + j - 1] + P[(i + 1)*step + j] * 2 + P[(i + 1)*step + j + 1] - P[(i - 1)*step + j - 1] - P[(i - 1)*step + j] * 2 - P[(i - 1)*step + j + 1]);
        }
    }
    addWeighted(imageX, 0.5, imageY, 0.5, 0, imageXY);//融合X、Y方向   
    convertScaleAbs(imageX, imageX8UC);
    convertScaleAbs(imageY, imageY8UC);
    convertScaleAbs(imageXY, imageXY8UC);   //转换为8bit图像 
 
    Mat imageSobel;
    Sobel(image, imageSobel, CV_8UC1, 1, 1); //Opencv的Sobel函数 
 
    imshow("Source Image", image);
    imshow("X Direction", imageX8UC);
    imshow("Y Direction", imageY8UC);
    imshow("XY Direction", imageXY8UC);
    imshow("Opencv Soble", imageSobel);
    waitKey();
    return 0;
}

 

#6,sobel算子的优缺点

优点:计算简单,速度很快;

缺点:计算方向单一,对复杂纹理的情况显得乏力;

  直接用阈值来判断边缘点欠合理解释,会造成较多的噪声点误判。

边缘检测sobel算子的更多相关文章

  1. 图像边缘检测——Sobel算子

    边缘是图像最基本的特征,其在计算机视觉.图像分析等应用中起着重要的作用,这是因为图像的边缘包含了用于识别的有用信息,是图像分析和模式识别的主要特征提取手段. 1.何为“图像边缘”? 在图像中,“边缘” ...

  2. [OpenCV入门教程之十二】OpenCV边缘检测:Canny算子,Sobel算子,Laplace算子,Scharr滤波器合辑

    http://blog.csdn.net/poem_qianmo/article/details/25560901 本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog ...

  3. 学习 opencv---(11)OpenC 边缘检测:Canny算子,Sobel算子,Laplace算子,Scharr滤波器

    本篇文章中,我们将一起学习OpenCV中边缘检测的各种算子和滤波器——Canny算子,Sobel算子,Laplace算子以及Scharr滤波器.文章中包含了五个浅墨为大家准备的详细注释的博文配套源代码 ...

  4. 边缘检测:Canny算子,Sobel算子,Laplace算子

    1.canny算子 Canny边缘检测算子是John F.Canny于 1986 年开发出来的一个多级边缘检测算法.更为重要的是 Canny 创立了边缘检测计算理论(Computational the ...

  5. Sobel算子取代:基于特定点方向的canny边缘检测

    前言: Canny边缘检测使用了Sobel算子,计算dx和dy两个方向,对于特定方向的边缘检测,可以作少量修改. 代码: 计算特定方向上的边缘 void CannyOrient( cv::Mat &a ...

  6. OpenCV——边缘检测(sobel算子、Laplacian算子、scharr滤波器)

    #include <opencv2/opencv.hpp> #include <iostream> using namespace cv; using namespace st ...

  7. EasyPR--开发详解(3)高斯模糊、灰度化和Sobel算子

    在上篇文章中我们了解了PlateLocate的过程中的所有步骤.在本篇文章中我们对前3个步骤,分别是高斯模糊.灰度化和Sobel算子进行分析. 一.高斯模糊 1.目标 对图像去噪,为边缘检测算法做准备 ...

  8. sobel算子原理及opencv源码实现

    sobel算子原理及opencv源码实现 简要描述 sobel算子主要用于获得数字图像的一阶梯度,常见的应用和物理意义是边缘检测. 原理 算子使用两个33的矩阵(图1)算子使用两个33的矩阵(图1)去 ...

  9. 彻底理解数字图像处理中的卷积-以Sobel算子为例

    彻底理解数字图像处理中的卷积-以Sobel算子为例 作者:FreeBlues 修订记录 2016.08.04 初稿完成 概述 卷积在信号处理领域有极其广泛的应用, 也有严格的物理和数学定义. 本文只讨 ...

随机推荐

  1. Twelves Monkeys (multiset解法 141 - ZOJ Monthly, July 2015 - H)

    Twelves Monkeys Time Limit: 5 Seconds      Memory Limit: 32768 KB James Cole is a convicted criminal ...

  2. Keepalived+nginx+redis主从+tomcat一机多实例实现会话共享

    Keepalived+nginx+redis主从+tomcat一机多实例实现会话共享 2014-09-09 14:14:25 标签:会话共享 主从 原创作品,允许转载,转载时请务必以超链接形式标明文章 ...

  3. c#导出到excel的几种解决方案

    (一)传统操作Excel遇到的问题: 1.如果是.NET[使用office组件Microsoft.Iffice.interop.Excel的话],需要在服务器端装Office,且及时更新它,以防漏洞, ...

  4. Bootstrap学习 进度条

    本文将介绍Bootstrap进度条,在本文中你将看到如何使用Bootstrap创建加载,重定向或动作状态的进度条 bootstrap进度条使用CSS3过渡和动画来获得该效果.Internet Expl ...

  5. java文档 第十一章 其他考量-b

    Finalization 和弱引用.软引用.虚引用 Finalization and Weak, Soft, and Phantom References Some applications inte ...

  6. java基础讲解11-----java中的异常

    1.java利用 try catch语句块捕获异常   2.finally语句  表示总是执行,不管程序是否异常 注意:1.在finally语句块异常  2.在前面的代码中使用Sysrtem.exit ...

  7. EMQ -- 用户密码认证

    emq 的用户密码认证 MQTT 认证设置 EMQ 消息服务器认证由一系列认证插件(Plugin)提供,系统支持按用户名密码.ClientID 或匿名认证. 系统默认开启匿名认证(anonymous) ...

  8. FreeBSD Top States

    转自:http://blog.csdn.net/fcoolx/article/details/4412196 select Process is blocked in the select(2) sy ...

  9. jquery cookie操作方法

    1. 设置cookie的值,把name变量的值设为value     $.cookie(’name’, ‘value’);  2.新建一个cookie 包括有效期 路径 域名等 $.cookie(’n ...

  10. Powerdesign使用小技巧(转载)

    1.做CDM模型的时候,因为开始定义ITEM的时候,没有注意把NAME和CODE全定义成一样的.结果后面想改的时候比较麻烦,一修改NAME结果CODE也变了.后来找到两个方法可以解决这个问题.A.Po ...