系列文章
Python+OpenCV图像处理(一)——OpenCV框架与图像插值算法
Python+OpenCV图像处理(二)——几何变换
Python+OpenCV图像处理(三)——彩色空间互换
Python+OpenCV图像处理(四)——图像滤波
Python+OpenCV图像处理(五)——图像阈值和二值化
Python+OpenCV图像处理(六)——边缘检测
六、边缘检测
6.1 边缘检测简介
边缘是指图像中图像像素值变化明显的位置。这些变化明显的位置常常是图像中需要关注的位置,对这些关键位置的检测,就叫做边缘检测。
一般情况下,我们为了检测这种不连续性,可以使用导数来完成。如下图所示:
由于在计算导数的时候,噪点很容易会被误检测作边缘,所以在进行边缘检测的时候,应先进行图像的滤波操作。
6.2 边缘检测算子
通常边缘检测的算子分为一阶算子和二阶算子,它们分别有以下几种代表:
- 一阶算子 —— Sobel算子,Roberts Cross算子,Prewitt算子, Kirsch算子,罗盘算子
- 二阶算子 —— Canny算子,Marr-Hildreth,在梯度方向的二阶导数过零点,Laplacian算子
6.2.1 Sobel算子
Sobel算子属于一阶算子,我们可以使用 3 × 3 3 \times 3 3×3 的卷积核来进行图像求导:
G y ′ = [ + 1 + 2 + 1 0 0 0 − 1 − 2 − 1 ] ∗ I 和 G x ′ = [ + 1 0 − 1 + 2 0 − 2 + 1 0 − 1 ] ∗ I {\displaystyle \mathbf {G}'_{y}={ \begin{bmatrix}+1&+2&+1\\0&0&0\\-1&-2&-1\end{bmatrix}}*\mathbf {I} \quad { {和}}\quad \mathbf{G}'_{x}={\begin{bmatrix}+1&0&-1\\+2&0&-2\\+1&0&-1\end{bmatrix}}*\mathbf {I} } Gy′=⎣⎡+10−1+20−2+10−1⎦⎤∗I和Gx′=⎣⎡+1+2+1000−1−2−1⎦⎤∗I
其中 I \mathbf {I} I表示原图片, G x ′ \mathbf {G}'_{x} Gx′和 G y ′ \mathbf {G}'_{y} Gy′分别表示沿图片水平和竖直方向上的变化, ∗ * ∗表示卷积操作
下面以Sobel算子为例讲述如何计算梯度
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 ] {\displaystyle \mathbf {G}_{x}={ \begin{bmatrix}-1&0&+1\\-2&0&+2\\-1&0&+1\end{bmatrix}} \quad { {和}}\quad \mathbf{G}_{y}={\begin{bmatrix}+1&+2&+1\\0&0&0\\-1&-2&-1\end{bmatrix}}} Gx=⎣⎡−1−2−1