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字节的文件头。
执行以上代码后,width=1024,height=991
2.把图片的每个像素作为一个元素储存在1024*991的矩阵中,便于计算
运算结果:
3.在2.中我们获得了图像的矩阵,然后给周围加上0.
输出结果:
4.通常边缘检测前会使用高斯滤波对图片进行处理,高斯滤波的作用就是消除图片中的噪点,是图片更平滑。下面是公式,其中是sigma需要自己设置值。
用这些代码可以将图片进行平滑处理,sigma用来设置平滑的程度。
Sigma=1时:(左为原图,右为经过平滑处理后的图片,后者看着会比前者模糊,这是高斯滤波后的正常现象)
5.进行高斯滤波处理后就可以使用sobel算子了,使用原理与4.一样
左为经过高斯滤波后的图像,右为将该图像边缘检测后的图像,可以明显的看出小狗的轮廓,这就是边缘检测。
后记:为了编写这些代码,3天的不眠不休,最终成功了。