一般有两种方法可以计算出这些变化率很快的点。

导数:连续函数上某点斜率,导数越大表示变化率越大,变化率越大的地方就越是“边缘”,但是在计算机中不常用,因为在斜率90度的地方,导数无穷大,计算机很难表示这些无穷大的东西。

微分:连续函数上x变化了dx,导致y变化了dy,dy值越大表示变化的越大,那么计算整幅图像的微分,dy的大小就是边缘的强弱了。

在连续函数里叫微分。由于图像是离散的,这里叫差分,和微分是一个意思,也是求变化率。

这就是 Sobel 边缘检测算子,偏 x 方向。(类似二元函数的偏导数,偏x,偏y)

用高斯滤波主要是去掉图像上的噪声。

计算一阶差分,OpenCV 源码中也是用 sobel 算子来算的。

算出来的梯度值,把不是极值的点,全部置0,去掉了大部分弱的边缘。所以图像边缘会变细。

在 t1 t2 之间的点,通过已确定的边缘点,发起8领域方向的搜索(广搜),图中可达的是边缘,不可达的点不是边缘。

在一阶微分图中极大值或极小值处,认为是边缘。

在二阶微分图中极大值和极小值之间与 x 轴相交的点,被认为是边缘。

二阶微分关心的是图像灰度的突变而不强调灰度缓慢变化的区域,对边缘的定位能力更强。

sobel 产生的边缘有强弱,抗噪性好(一阶算子)

canny 产生的边缘很细,可能就一个像素那么细,没有强弱之分(一阶算子)

laplace 对边缘敏感,可能有些是噪声的边缘,也被算进来了(二阶算子)

下面三张图分别是 sobel,canny,laplace 结果图。

对图像先进行高斯滤波(G × f),再进行Laplace算子运算Δ(G × f)

对过零点的精确位置进行插值估计。

由上图可以看出,高斯滤波之后边缘信息才突显出来。

根据sigma的不同以及 3 sigma 原则可以建立不同的模板,sigma 是一个尺度参数,在图像处理中引入尺度以及建立多尺度空间是一个重要的突破,sigma 越大,图像越模糊滤除噪声效果越好,sigma 越小,效果越差。

常用模板如下:

右边比LOG算子只是多了一个系数,在实际应用中不影响。

我们定义:

当我们用DOG算子代替LOG算子与图像卷积的时候:

近似的LOG算子 值的选取:

当使用这个值时,可以保证 LoG 和 DoG 的过零点相同,只是幅度大小不同。

这样,我们只要对图像进行两次高斯平滑再将结果相减就可以近似得到LOG作用于图像的效果了!

Eli发表在《tensorflow设置不同层不同学习率》