边缘检测sobel算子

边缘检测sobel算子sobel算子-sophia_hxw-博客园http://www.cnblogs.com/sophia-hxw/p/6088035.html#1,个人理解网上查了很多资料,都说sobel

大家好,又见面了,我是你们的朋友全栈君。

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方向上的卷积;

<span role="heading" aria-level="2">边缘检测sobel算子

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

<span role="heading" aria-level="2">边缘检测sobel算子

可以简化成:

<span role="heading" aria-level="2">边缘检测sobel算子

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

<span role="heading" aria-level="2">边缘检测sobel算子

 

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

<span role="heading" aria-level="2">边缘检测sobel算子<span role="heading" aria-level="2">边缘检测sobel算子

 

#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梯度'
);

处理结果:

<span role="heading" aria-level="2">边缘检测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算子的优缺点

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/155210.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 操作系统和网络基础知识整理「建议收藏」

    一为什么要有操作系统现代的计算机系统主要是由一个或者多个处理器,主存,硬盘,键盘,鼠标,显示器,打印机,网络接口及其他输入输出设备组成。一般而言,现代计算机系统是一个复杂的系统。其一:如果每位

    2022年3月29日
    38
  • 走进webpack(3)– 小结「建议收藏」

    写这一系列的文章,本意是想要梳理一下自己凌乱的webpack知识,只是使用过vue-cli,修改过其中的一部分代码,但是对于一个简单项目从0开始搭建webpack的流程和其中的依赖并不是十分清楚。所以

    2022年3月25日
    43
  • 锂电池充电IC_锂电池充电器电路

    锂电池充电IC_锂电池充电器电路HE4484E是一款5VUSB适配器输入,高精度双节锂离子电池充电管理芯片。具有0V充电功能,涓流充电、恒流充电、恒压充电和自动截止、自动再充等一套完整充电循环的充电管理芯片。芯片内部特设9V抗浪涌,芯片应用更安全可靠。HE4484E标准浮充电压为8.40V,其底部带有散热片接地的ESOP8封装,极其精简的外部器件,使得HE4484E成为便携式双节锂锂电池充电应用的理想选择。HE4484E适合USB适配器或其它5V适配器工作,极大降低了外部配件成本。当输入电压(USB电源或AC适配器)被拿掉时,HE4484

    2022年10月6日
    2
  • soapui使用教程1-基本使用和录制

    soapui使用教程1-基本使用和录制1,创建个rest项目,File-&gt;NewProject:2,然后APIDefinition选择REST,点OK3.,资源根属性,选择如何处理资源绝路径,默认是绝对路径;还可以选择项目路径或工作区路径4,ProjectPassword属性来加密项目内容,不过密码如果忘记将无法找回5,还可以通过内置浏览器生成testcase,File-&gt;New…

    2022年6月29日
    23
  • elasticsearch集群搭建_Linux如何关闭kafka集群

    elasticsearch集群搭建_Linux如何关闭kafka集群安装包自己自行准备,或者用我百度网盘的安装包,ElasticSearchLogstashKibanaFileBeat:**链接:**https://pan.baidu.com/s/1_Iv2R8pmYaHkoaOk_m8OuQ提取码:5ezt复制这段内容:后打开百度网盘手机App,操作更方便哦创建普通用户ES不能使用root用户来启动,必须使用普通用户来安装启动。这里我们创建一个普通用户以及定义一些常规目录用于存放我们的数据文件以及安装包等。创建一个es专门的用户(必须)使

    2022年10月13日
    3
  • RST报文详解_modbus网关使用方法

    RST报文详解_modbus网关使用方法我们知道TCP建立连接的时候需要三次连接,TCP释放连接的时候需要四次挥手,在这个过程中,出现了很多特殊的标志报文段,例如SYNACKFIN,在TCP协议中,除了上面说了那些标志报文段之外,还有其他的报文段,如PUSH标志报文段以及今天需要重点讲解的RST报文段。RST:(Resettheconnection)用于复位因某种原因引起出现的错误连接,也用来拒绝非法数据和请求。如果接收到R…

    2022年10月1日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号