OpenCV——图像梯度与边缘检测
6.1 简介
严格的说,梯度计算需要求导数。但是图像梯度的计算,是通过计算像素值的差得到梯度的近似值。图像梯度表示的是图像变化的速度,反映了图像的边缘信息。
边缘是像素值快速变化的地方。所以对于图像的边缘部分,其灰度值变化较大,梯度值也较大;对于图像中较平滑的部分,其灰度值变化较小,梯度值也较小。
为了检测边缘,我们需要检测图像中的不连续性,可以使用图像梯度来检测不连续性。
但是,图像梯度也会受到噪声的影响,因此建议先对图像进行平滑处理。
6.2 学习目标
- 掌握图像梯度与几种算子的原理
- 掌握Canny边缘检测的原理
6.3 内容介绍
- 图像梯度与Sobel算子
- Canny边缘检测介绍
- OpenCV代码实践
6.4 算法理论介绍与推荐
6.4.1 图像梯度与几种算子
“滤波器”也可以称为“卷积核”,“掩膜”,“算子”等。
1、Sobel算子
Sobel算子是一个 3 × 3 3×3 3×3的卷积核,利用局部差分寻找边缘,计算得到梯度的近似值。
x和y方向的Sobel算子分别为:
G x = [ − 1 0 1 − 2 0 2 − 1 0 1 ] G y = [ − 1 − 2 − 1 0 0 0 1 2 1 ] Gx=\begin{bmatrix} -1 & 0 & 1 \\ -2 & 0 & 2\\ -1 & 0 & 1 \end{bmatrix}\\ \ \\ Gy=\begin{bmatrix} -1 & -2 & -1 \\ 0 & 0 & 0\\ 1 & 2 & 1 \end{bmatrix} Gx=⎣⎡−1−2−1000121⎦⎤ Gy=⎣⎡−101−202−101⎦⎤
梯度有方向,对于一个图像,可以通过Sobel算子分别计算水平方向和垂直方向的偏导数的近似值。
计算水平方向偏导数的近似值
设原图像大小为 3 × 3 3×3 3×3,水平方向偏导数 G x Gx Gx为:
计算像素点P5的梯度,需要利用邻域内的像素点,公式为:
P 5 x = ( P 3 − P 1 ) + 2 ( P 6 − P 4 ) + ( P 9 − P 7 ) P5x=(P3-P1)+2(P6-P4)+(P9-P7) P5x=(P3−P1)+2(P6−P4)+(P9−P7)
即用像素点P5右侧像素值减去左侧像素值,距离P5近的点权重较大,为2;距离P5远的点权重较小,为1。
计算垂直方向偏导数的近似值
设原图像大小为 3 × 3 3×3 3×3,垂直方向偏导数 G y Gy Gy为:
计算像素点P5的梯度,需要利用邻域内的像素点,公式为:
P 5 y = ( P 7 − P 1 ) + 2 ( P 8 − P 2 ) + ( P 9 − P 3 ) P5y=(P7-P1)+2(P8-P2)+(P9-P3) P5y=(P7−P1)+2(P8−P2)+(P9−P3)
即用像素点P5下一行的像素值减去上一行的像素值,距离P5近的点权重较大,为2;距离P5远的点权重较小,为1。
2、Scharr算子
x和y方向的Scharr算子分别为:
G x = [ − 3 0 3 − 10 0 10 − 3 0 3 ] G y = [ − 3 − 10 − 3 0 0 0 3 10 3 ] Gx=\begin{bmatrix} -3 & 0 & 3 \\ -10 & 0 & 10\\ -3 & 0 & 3 \end{bmatrix}\\ \ \\ Gy=\begin{bmatrix} -3 & -10 & -3 \\ 0 & 0 & 0\\ 3 & 10 & 3 \end{bmatrix} Gx=⎣⎡−3<