当前位置 : 主页 > 网络编程 > 其它编程 >

利用sobel算子进行边缘检测

来源:互联网 收集:自由互联 发布时间:2023-07-02
2017-11-1800:31前言本文章中的一部分代码写得比较仓促虽然比原来写的结构性更强但仍有缺陷下一篇中的代码 2017-11-18 00:31 前言:本文章中的一部分代码写得比较仓促,虽然比原来写的结
2017-11-1800:31前言本文章中的一部分代码写得比较仓促虽然比原来写的结构性更强但仍有缺陷下一篇中的代码

2017-11-18 00:31

前言:本文章中的一部分代码写得比较仓促,虽然比原来写的结构性更强,但仍有缺陷,下一篇中的代码经过了稍微修改。Sobel算子是整像素图像边缘检测中最重要的算子之一,该算子包含两组3x3的矩阵,分别为横向及纵向,将之与图像 作平面卷积,即可分别得出横向及纵向的亮度差分近似值。如果以A代表原始图像,Gx及Gy分别代表经横向及纵向边缘 检测的图像,其公式如下:

图像的每一个像素的横向及纵向梯度近似值可用以下的公式结合,来计算梯度的大小。  

可用以下公式计算梯度方向。

用sobel算子进行卷积的方法:

将图像转化成矩阵后,首先设计卷积核,多数情况下是3*3的矩阵,这里把sobel算子作为卷积核,如下,依次在图 像矩阵中移动卷积核。

把被卷积核覆盖的区域中的对应元素相乘,然后9个值相加作为一个像素的值,赋给输出的矩阵。

但这样做会导致图片变小,因此有一种做法就是在图片矩阵四周加上0,再运算。

例:

这里有一张小狗的图片,大小为1024px * 991px,原图是以jpeg格式储存的,我们需要读取每一个像素的RGB值,由于我还 没搞清jpeg的压缩方式,这里先使用windows的画图软件将它转化为24位的bmp位图。下面的代码使用的是python语言。

这里以对这张图片进行边缘检测为例:

1.首先,第一步读取图片信息:代码如下

上面代码可以读出图片的大小,同时为输出图像写入了24位bmp位图前面共54字节的文件头。

执行以上代码后," src="https://img3.php1.cn/3cdc5/6447/4aa/3fd3bd6ea7fea3eb.png" />

运算结果:

3.在2.中我们获得了图像的矩阵,然后给周围加上0.

输出结果:

4.通常边缘检测前会使用高斯滤波对图片进行处理,高斯滤波的作用就是消除图片中的噪点,是图片更平滑。下面是公式,其中是sigma需要自己设置值。

用这些代码可以将图片进行平滑处理,sigma用来设置平滑的程度。

Sigma=1时:(左为原图,右为经过平滑处理后的图片,没有考虑颜色,导致图片成了黑白的,后者看着会比前者模糊,这是高斯滤波后的正常现象)

 

5.进行高斯滤波处理后就可以使用sobel算子了,使用原理与4.一样 

左为经过高斯滤波后的图像,右为将该图像边缘检测后的图像,可以明显的看出小狗的轮廓,这就是边缘检测。  

后记:为了编写这些代码,3天的不眠不休,最终成功了。

【文章转自日本多IP服务器 http://www.558idc.com/japzq.html提供,感恩】
上一篇:开发笔记:golang操作mysql数据库
下一篇:没有了
网友评论