索贝尔算子Sobel operator
索贝尔算子(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相关推荐
- 【OpenCV入门学习--python】索贝尔算子Sobel operator提取边缘
例子源于OpenCV官网手册(https://docs.opencv.org/4.x/d2/d2c/tutorial_sobel_derivatives.html) 使用OpenCV函数Sobel() ...
- Finding the Edges (Sobel Operator)
Finding the Edges (Sobel Operator) - Computerphile 特别好理解 索贝尔算子 该算子包含两组3x3的矩阵,分别为横向及纵向,将之与图 ...
- python+opencv:边缘提取-Sobel operator
在理想情况下,对图像应用边缘检测器的结果可能会导致一组连接曲线,表明物体的边界,表面标记的边界以及对应于表面方向不连续点的曲线. 因此,对图像应用边缘检测算法可以显著减少要处理的数据量,因此可以过滤掉 ...
- OpenCV 拉普拉斯算子Laplace Operator
OpenCV 拉普拉斯算子Laplace Operator 拉普拉斯算子Laplace Operator 目标 理论 拉普拉斯算子 代码 解释 声明变量 加载源图像 减少噪音 灰阶 拉普拉斯算子 将输 ...
- python opencv 常用增强 dct变换+侵蚀+扩张+索贝尔算子+直方图均衡化+光照平衡+
裁剪操作 img=img[100:200,:,:] 通道置零 img[:,:,2]=0 侵蚀 扩张 frame = cv2.erode(frame, kernel=np.ones((5, 5))) # ...
- 【OpenCV入门教程之十二】OpenCV边缘检测:Canny算子,Sobel算子,Laplace算子,Scharr滤波器合辑
本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接: http://blog.csdn.net/poem_qianmo/article/details/25560901 作者:毛星云(浅墨) ...
- 图像处理中的梯度、导数如何求?(Robert算子,Sobel算子,Prewitt算子,Laplace算子)
梯度的求法是多种多样的,根据不同的处理需要选择合适的算子(模版). 1.水平垂直差分法 2.Robert 梯度算子 3.Sobel算子 垂直方向 ...
- 一文解决Opencv四大经典算子——sobel算子、scharr算子、laplacian算子、canny算子
Opencv四大算子 Sobel算子 Scharr算子 laplacian算子 canny算子 总结 边缘是像素值发生跃迁的位置,是图像的显著特征之一,在图像特征提取,对象检测,模式识别等方面都有重要 ...
- 图像梯度算子——Sobel/scharr/Laplacian
1.sobel算子 sobel算子可以计算图像梯度,计算图像梯度的作用是提取边界. (1)X方向的梯度 以3x3的卷积核计算sobel算子为例: 图中左边就是计算水平梯度时的卷积核,简单来说就是右边减 ...
最新文章
- 随机顺序_SSD固态硬盘的顺序读写和随机读写区别,谁更重要?
- 初学Python——RabbitMQ的安装
- 20180530更新
- Table 'barfoo_datacenter_config.parttemplates' doesn't exist------Mysql
- 【javascript权威指南】类型转换
- 笑看职场什么程序员才抢手,什么样的程序员涨薪多?
- C 怎么读取Cpp文件_python之调用C加速计算(一)
- java 创建存储过程_如何在pl/sql中创建及调用JAVA存储过程 | 学步园
- 集合交集,并集,差集运算
- java单例模式的7种实现方式
- 字符串的数组形式与指针形式
- 非主流字体输入法_魏大勋更博晒非主流自拍,粉丝的关注点却在他的字体上,太复杂了...
- 计算机的用途英语作文带翻译,关于旅行的英语作文带翻译(通用7篇)
- 未转变者服务器配置要求,游戏配置 - 未转变者中文维基 | Unturned资料站 - 灰机wiki...
- 2021-02-15 大数据课程笔记 day26
- 夏令营导师自荐信计算机专业,北大夏令营的自荐信
- 【哈士奇赠书活动 - 23期】-〖你好 ChatGPT〗
- “AI+机器人”持续为多领域增“智”添“质”,开启效益增长飞轮
- unity入门2.0
- 彩色matlab代码拷贝到word研究,matlab编辑器合并_彩色MATLAB代码拷贝到WORD研究