数字图像处理成长之路7:边缘检测(sobel canny)

简介

边缘检测是图像处理中使用频率很高的方法,在进行更复杂的图像处理之前,我们常常先对图像进行边缘检测,以去除图像一些无用的部分,并保留一些对我们有用的部分。

原理

边缘检测意在检测出图像的边缘,那何为边缘?简单的理解是,边缘是图像中明暗变化剧烈的地方。如果从图像的x轴方向抽出一列数据,绘出它的图像,并假设是连续的曲线,则曲线陡升或陡降出就代表边缘。从数学角度看,陡升或陡降意味着该处的斜率比较大。反过来说,斜率大的地方意味着是边缘。而斜率是曲线在该点的导数,因此求边缘的问题可以转换成求导数。
导数往往指二维平面上的曲线变化率,而图像实际是三维空间的。图像的长(x轴),宽(y轴),像素值(z轴)所组成的三维,像素值组成了一个曲面。对曲面在x轴方向求导数,叫做x方向的偏导数,同样的,也存在y方向的偏导数。而有x,y轴所围成的平面有无数个方向,所以存在无数个方向的导数,我们可以通过x,y方向的偏导数求得任意方向的导数。在这些方向的导数中,存在某一个方向,且该方向导数值最大,这个导数称作曲面在该点的梯度。
图像在该点的梯度意味着在该点的某方向灰度值变化最快,这就意味着边缘的存在。
我们用数字图像处理成长之路7:边缘检测(sobel canny)代表曲面上a点的梯度。数字图像处理成长之路7:边缘检测(sobel canny)为曲面上a点的方向导数,u代表方向。
则有数字图像处理成长之路7:边缘检测(sobel canny),当方向指向梯度方向(梯度方向用m表示)时,数字图像处理成长之路7:边缘检测(sobel canny)
所以检测图像的边缘问题变成了求图像梯度。由梯度的数学求法可知,数字图像处理成长之路7:边缘检测(sobel canny)

梯度算子

在计算机中我们常常用差分代替微分,用求和代替求平方,上式子可以简化为:
数字图像处理成长之路7:边缘检测(sobel canny)其中,
数字图像处理成长之路7:边缘检测(sobel canny)
数字图像处理成长之路7:边缘检测(sobel canny)
对应的模板为:
数字图像处理成长之路7:边缘检测(sobel canny)数字图像处理成长之路7:边缘检测(sobel canny)

Roberts算子

该算子是另一种近似求梯度法。对应模板为:
数字图像处理成长之路7:边缘检测(sobel canny)数字图像处理成长之路7:边缘检测(sobel canny)

Prewitt算子

数字图像处理成长之路7:边缘检测(sobel canny)数字图像处理成长之路7:边缘检测(sobel canny)

Sobel算子

数字图像处理成长之路7:边缘检测(sobel canny)数字图像处理成长之路7:边缘检测(sobel canny)

这几个算子比较简单,下面看一下Sobel算子检测的结果:
数字图像处理成长之路7:边缘检测(sobel canny)
数字图像处理成长之路7:边缘检测(sobel canny)

canny检测

经上面几个算子处理后的图像,已经检测出了边缘,不过边缘显得有些模糊。下面简单说说canny算法:
1)用高斯平滑处理
2)算出梯度和梯度方向
3)对梯度值进行非极大值抑制
4)用双阈值算法检测和连接边缘
下面看看效果
数字图像处理成长之路7:边缘检测(sobel canny)
数字图像处理成长之路7:边缘检测(sobel canny)
网上谈canny算法的文章很多,不过大多是用opencv,这对我们从根本上理解该算法并无多大帮助,十分想用c/c++实现canny算法,但限于我的能力和时间,并没有完全实现canny,倒是实现了一小部分。

也许也不能称之为我的这个算法是未完成的canny,因为这是按照我的理解写的,也许并不符合canny的本意。但是先看看我的处理结果:
数字图像处理成长之路7:边缘检测(sobel canny)

再来对比一下sobel算法的结果:
数字图像处理成长之路7:边缘检测(sobel canny)

我的算法比canny保留了更多细节,同时比sobel的算法更加突出细节。这种结果对寻找图像中的小细节十分合适。

数字图像处理成长之路7:边缘检测(sobel canny)

数字图像处理成长之路7:边缘检测(sobel canny)