图像边缘检测
边缘检测基本思想
基本边缘检测算子
Canny算子
一、基本思想
对数字图像做微分(差分),得到一阶微分结果
对结果再求一次微分
利用两次的结果
边缘检测的本质是微分
实际中常用差分,x方向和y方向
二、基本边缘检测算子(形式简单,但容易受噪声影响)
Robert算子卷积核
边缘检测所有对应系数和为0,边缘检测对应高通滤波(差分)
Sobel算子
Sobel算子卷积核(左右分别是x,y方向卷积核,相关模板正好要上下,左右翻转)
Laplace算子
任何一个函数拉普拉斯作用结果等于x方向两阶偏导加上y方向两阶偏导
差分有效检测边缘,但也会使噪声变大
LoG算子
首先对原始图像进行高斯滤波,然后再使用拉普拉斯算子
首先对高斯函数求拉普拉斯变换,进一步用上一步结果再和图像进行卷积
(高斯函数求拉普拉斯事先可知,只算一次)
三、Canny算子
已有方法问题:噪声,断裂,虚检(渐变灰度)
Canny算子核心优点:边缘可自动连通
算法步骤:
平滑图像同时计算微分;
计算梯度(幅值和方向);
梯度幅值进行非极大值抑制;
自动边缘连接
步骤1:同时平滑与微分
使用高斯函数的一阶导数同时完成平滑和微分
步骤2:梯度计算
进一步可得梯度幅值和方向:
方向离散化:离散化为上下左右和斜45°共4个方向
步骤3:梯度幅值非极大值抑制
细化梯度幅值图像中的屋脊带,质保,刘幅值局部变化最大的点
使用一个3*3邻域作用于幅值阵列的所有点。在每一点上,邻域的中心像素与沿梯度方希的两个梯度幅值的插值结果进行比较,仅保留极大值点
步骤4:边缘连接
对上一步得到的图像使用低、高阈值τ1τ2阈值化,得到三幅图像
T1对应假边缘,去除
T3对应真边缘,全部保留
T2连接:临接像素中是否有属于T3的像素
实现
Sobel算子:
dst = cv.Sobel(src, ddepth, dx, dy[, dst[, ksize[, scale[, delta[, borderType]]]]])
拉普拉斯算子:
dst = cv.Laplacian(src, ddepth[, dst[, ksize[, scale[, delta[, borderType]]]]])
Canny算子:
dst = cv.Canny(image, threshold1, threshold2[, deges[, apertureSize[, L2gradient]]])
总结:
- 边缘检测即图像差分
- 常见边缘检测算子包括Robert算子,Sobel算子,LoG算子等,其中Sobel算子最为常用
- Canny算子的基本优点在于检测准确、对噪声稳健,在实际中广泛应用