索贝尔算子(Sobeloperator)主要用于获得数字图像的一阶梯度,是一种离散性差分算子。它是prewitt算子的改进形式,改进之处在于sobel算子认为,邻域的像素对当前像素产生的影响不是等价的,所以距离不同的像素具有不同的权值,对算子结果产生的影响也不同。一般来说,距离越远,产生的影响越小。

图像处理中认为,灰度值变化剧烈的地方就是边缘。那么如何判断灰度值变化?如何度量“剧烈”?sobel算子就对这些问题做了自己的规范,而且命名为sobel算子,就是对一副图像的输入到输出边缘信息的整个处理过程。

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

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

卷积核和算法实现原理:

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

具体计算如下:

图像的每一个像素的横向及纵向灰度值通过以下公式结合,来计算该点灰度的大小:

通常,为了提高效率使用不开平方的近似值:

然后可用以下公式计算梯度方向:

若图像为:

则使用近似公式的计算的结果为:

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

MTLAB代码实现:

来源:https://www.cnblogs.com/wxl845235800/p/7700887.html

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('lena.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梯度');
结果:

C++代码实现:

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

#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("lena.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;
}
         由于Sobel算子是滤波算子的形式,用于提取边缘,可以利用快速卷积函数, 简单有效,因此应用广泛。美中不足的是,Sobel算子并没有将图像的主体与背景严格地区分开来,即Sobel算子没有严格地模拟人的视觉生理特征,所以提取的图像轮廓有时并不能令人满意。    
————————————————
版权声明:本文为CSDN博主「libocao」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/libocao/article/details/88958239

索贝尔算子Sobel operator相关推荐

  1. 【OpenCV入门学习--python】索贝尔算子Sobel operator提取边缘

    例子源于OpenCV官网手册(https://docs.opencv.org/4.x/d2/d2c/tutorial_sobel_derivatives.html) 使用OpenCV函数Sobel() ...

  2. Finding the Edges (Sobel Operator)

    Finding the Edges (Sobel Operator) - Computerphile           特别好理解 索贝尔算子 该算子包含两组3x3的矩阵,分别为横向及纵向,将之与图 ...

  3. python+opencv:边缘提取-Sobel operator

    在理想情况下,对图像应用边缘检测器的结果可能会导致一组连接曲线,表明物体的边界,表面标记的边界以及对应于表面方向不连续点的曲线. 因此,对图像应用边缘检测算法可以显著减少要处理的数据量,因此可以过滤掉 ...

  4. OpenCV 拉普拉斯算子Laplace Operator

    OpenCV 拉普拉斯算子Laplace Operator 拉普拉斯算子Laplace Operator 目标 理论 拉普拉斯算子 代码 解释 声明变量 加载源图像 减少噪音 灰阶 拉普拉斯算子 将输 ...

  5. python opencv 常用增强 dct变换+侵蚀+扩张+索贝尔算子+直方图均衡化+光照平衡+

    裁剪操作 img=img[100:200,:,:] 通道置零 img[:,:,2]=0 侵蚀 扩张 frame = cv2.erode(frame, kernel=np.ones((5, 5))) # ...

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

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

  7. 图像处理中的梯度、导数如何求?(Robert算子,Sobel算子,Prewitt算子,Laplace算子)

    梯度的求法是多种多样的,根据不同的处理需要选择合适的算子(模版). 1.水平垂直差分法 2.Robert 梯度算子 3.Sobel算子               垂直方向               ...

  8. 一文解决Opencv四大经典算子——sobel算子、scharr算子、laplacian算子、canny算子

    Opencv四大算子 Sobel算子 Scharr算子 laplacian算子 canny算子 总结 边缘是像素值发生跃迁的位置,是图像的显著特征之一,在图像特征提取,对象检测,模式识别等方面都有重要 ...

  9. 图像梯度算子——Sobel/scharr/Laplacian

    1.sobel算子 sobel算子可以计算图像梯度,计算图像梯度的作用是提取边界. (1)X方向的梯度 以3x3的卷积核计算sobel算子为例: 图中左边就是计算水平梯度时的卷积核,简单来说就是右边减 ...

最新文章

  1. 随机顺序_SSD固态硬盘的顺序读写和随机读写区别,谁更重要?
  2. 初学Python——RabbitMQ的安装
  3. 20180530更新
  4. Table 'barfoo_datacenter_config.parttemplates' doesn't exist------Mysql
  5. 【javascript权威指南】类型转换
  6. 笑看职场什么程序员才抢手,什么样的程序员涨薪多?
  7. C 怎么读取Cpp文件_python之调用C加速计算(一)
  8. java 创建存储过程_如何在pl/sql中创建及调用JAVA存储过程 | 学步园
  9. 集合交集,并集,差集运算
  10. java单例模式的7种实现方式
  11. 字符串的数组形式与指针形式
  12. 非主流字体输入法_魏大勋更博晒非主流自拍,粉丝的关注点却在他的字体上,太复杂了...
  13. 计算机的用途英语作文带翻译,关于旅行的英语作文带翻译(通用7篇)
  14. 未转变者服务器配置要求,游戏配置 - 未转变者中文维基 | Unturned资料站 - 灰机wiki...
  15. 2021-02-15 大数据课程笔记 day26
  16. 夏令营导师自荐信计算机专业,北大夏令营的自荐信
  17. 【哈士奇赠书活动 - 23期】-〖你好 ChatGPT〗
  18. “AI+机器人”持续为多领域增“智”添“质”,开启效益增长飞轮
  19. unity入门2.0
  20. 彩色matlab代码拷贝到word研究,matlab编辑器合并_彩色MATLAB代码拷贝到WORD研究

热门文章

  1. 适合Vue用户的React教程,你值得拥有
  2. 信号的传递方式:连续系统和离散系统
  3. android开发 修改图片色调饱和度、色相、亮度处理
  4. gpt分区无法安装win10怎么办
  5. 改变人生的100句话
  6. 碳材料家族喜添新成员,石墨到金刚石相变机制被阐明
  7. 【100%通过率】华为OD机试真题 Java 实现【最多组合直角三角形个数】【2023 Q1 | 100分】
  8. Ubuntu下使用wget下载https的文件时候报错
  9. 2020年全国计算机二级选择题,2020年全国计算机二级MSOffice试题(8)
  10. SpringBoot项目添加webapp目录