利用sobel算子进行边缘检测

2017-11-18 00:31

前言:本文章中的一部分代码写得比较仓促,虽然比原来写的结构性更强,但仍有缺陷,下一篇中的代码经过了稍微修改。

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

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

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

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

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

利用sobel算子进行边缘检测_第1张图片

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

利用sobel算子进行边缘检测_第2张图片

但这样做会导致图片变小,因此有一种做法就是在图片矩阵四周加上0,再运算。利用sobel算子进行边缘检测_第3张图片

例:

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

利用sobel算子进行边缘检测_第4张图片

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

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

利用sobel算子进行边缘检测_第5张图片

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

执行以上代码后,width=1024,height=991

 

2.把图片的每个像素作为一个元素储存在1024*991的矩阵中,便于计算

利用sobel算子进行边缘检测_第6张图片

利用sobel算子进行边缘检测_第7张图片

运算结果:

利用sobel算子进行边缘检测_第8张图片

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

利用sobel算子进行边缘检测_第9张图片

输出结果:

利用sobel算子进行边缘检测_第10张图片

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

利用sobel算子进行边缘检测_第11张图片

利用sobel算子进行边缘检测_第12张图片

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

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

利用sobel算子进行边缘检测_第13张图片利用sobel算子进行边缘检测_第14张图片

 

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

利用sobel算子进行边缘检测_第15张图片

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

利用sobel算子进行边缘检测_第16张图片利用sobel算子进行边缘检测_第17张图片

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

你可能感兴趣的:(python,python,计算机,图像识别)