图像局部特征的不连续性,即:灰度或结构信息的突变。
①降噪,平滑处理 ②边缘点的检测 ③边缘定位
∇ f = g r a d ( f ) ( g x g y ) = ( ∂ f ∂ x ∂ f ∂ y ) \nabla f = grad(f) \dbinom{g_x}{g_y}=\dbinom{\frac{\partial f}{\partial x}}{\frac{\partial f}{\partial y}} ∇f=grad(f)(gygx)=(∂y∂f∂x∂f) M ( x , y ) = m a g ( ∇ f ) = g x 2 + g y 2 M(x, y)=mag(\nabla f)=\sqrt{{g_x}^2+g_y^2} M(x,y)=mag(∇f)=gx2+gy2 其中, g x , g y g_x, g_y gx,gy和 M ( x , y ) M(x, y) M(x,y)都是与原图大小相同的图像。
在每个像素点计算偏导数 ∂ f ∂ x , ∂ f ∂ y \frac{\partial f}{\partial x}, \frac{\partial f}{\partial y} ∂x∂f,∂y∂f: g x = ∂ f ( x , y ) ∂ x = f ( x + 1 , y ) − f ( x , y ) g_x=\frac{\partial f(x, y)}{\partial x}=f(x+1, y)-f(x, y) gx=∂x∂f(x,y)=f(x+1,y)−f(x,y) g x = ∂ f ( x , y ) ∂ y = f ( x , y + 1 ) − f ( x , y ) g_x=\frac{\partial f(x, y)}{\partial y}=f(x, y+1)-f(x, y) gx=∂y∂f(x,y)=f(x,y+1)−f(x,y)
一阶算子:Roberts算子、Sobel算子、Prewitt算子... 二阶算子:Canny算子、Laplacian算子、Marr-Hildreth算子...
原理:利用局部差分算子寻找边缘。采用对角线方向相邻两像素之间差的平方和近似梯度幅值检测边缘。 y i , j = x i , j y_{i,j}=\sqrt{x_{i,j}} \\ yi,j=xi,j z i , j = ( y i , j − y i + 1 , j + 1 ) 2 + ( y i + 1 , j − y i , j + 1 ) 2 z_{i,j}=\sqrt{(y_{i,j}-y_{i+1,j+1})^2+{(y_{i+1,j}-y_{i,j+1})}^2} zi,j=(yi,j−yi+1,j+1)2+(yi+1,j−yi,j+1)2 其中, x是图像中的初始强度值, z是计算得到的导数, i,j代表像素点在图像中位置. 公式: [ + 1 0 0 − 1 ] a n d [ 0 + 1 − 1 0 ] \begin{bmatrix} +1 & 0 \\ 0 & -1\end{bmatrix} \quad and \quad \begin{bmatrix}0& +1 \\ -1 & 0\end{bmatrix} [+100−1]and[0−1+10] I ( x , y ) I(x,y) I(x,y)是图像中的一点, G x ( x , y ) \mathbf{G}_x(x,y) Gx(x,y)是用第一个核卷积后生成的图像中一点, G y ( x , y ) \mathbf{G}_y(x,y) Gy(x,y)是用第二个核卷积后生成的图像中一点, 则梯度可悲定义为: ∇ I ( x , y ) = G ( x , y ) = G x 2 + G y 2 \nabla I(x,y)=\mathbf{G}(x,y)=\sqrt{\mathbf{G}_x^2+\mathbf{G}_y^2} ∇I(x,y)=G(x,y)=Gx2+Gy2 梯度的方向则可被定义为: Θ ( x , y ) = a r c t a n G y ( x , y ) G x ( x , y ) − 3 π 4 \mathbf{\Theta} (x,y)=arctan\frac{\mathbf{G}_y (x,y)}{\mathbf{G}_x(x,y)}-\frac{3\pi}{4} Θ(x,y)=arctanGx(x,y)Gy(x,y)−43π 0 ° 0\degree 0°角对应于垂直方向,以使从黑色到白色的最大对比度方向在图像上从左到右。
特点:
检测垂直边缘效果好于斜向;定位精度高;对噪声敏感,无法抑制噪声影响.原理: Prewitt算子使用两个 3 × 3 3\times 3 3×3的卷积核来计算近似导数. (一个用于水平变化, 另一个用于垂直方向的变化). A A A是原始图像, G x G_x Gx和 G y G_y Gy是包含了水平和垂直方向的近似导数的图像. G x = [ + 1 0 − 1 + 1 0 − 1 + 1 0 − 1 ] ∗ A a n d G y = [ + 1 + 1 + 1 0 0 0 − 1 − 1 − 1 ] ∗ A \mathbf {G}_x=\begin{bmatrix}+1 & 0 & -1 \\+1 & 0 & -1 \\+1 & 0 & -1 \end{bmatrix} * \mathbf {A}\quad and \quad \mathbf {G}_y=\begin{bmatrix}+1 & +1 & +1 \\0 & 0 & 0 \\-1 & -1 & -1 \end{bmatrix} * \mathbf {A} Gx=⎣⎡+1+1+1000−1−1−1⎦⎤∗AandGy=⎣⎡+10−1+10−1+10−1⎦⎤∗A Prewitt算子可分解为一个平均算子和一个差分算子的积, 平滑后计算梯度. 因此, 可视为一个可分离滤波器. G x G_x Gx可写为: [ + 1 0 − 1 + 1 0 − 1 + 1 0 − 1 ] = [ 1 1 1 ] [ + 1 0 − 1 ] \begin{bmatrix}+1 & 0 & -1 \\+1 & 0 & -1 \\+1 & 0 & -1 \end{bmatrix} = \begin{bmatrix}1\\1\\1\end{bmatrix} \begin{bmatrix}+1 & 0 & -1\end{bmatrix} ⎣⎡+1+1+1000−1−1−1⎦⎤=⎣⎡111⎦⎤[+10−1] 在此,将x坐标定义为在“左”方向上增加,并且将y坐标定义为在“上”方向上增加。 在图像的每个点上,可以使用以下方法组合得到的梯度近似值以给出梯度大小:
G = G x 2 + G y 2 {\displaystyle \mathbf {G} = {\sqrt {{\mathbf {G} _ {x}} ^ {2} + {\mathbf {G} _ {y}} ^ {2}}}} G=Gx2+Gy2 同理, 可计算梯度的方向: Θ = atan2 ( G y , G x ) \mathbf {\Theta } =\operatorname {atan2} \left({\mathbf {G} _{y},\mathbf {G} _{x}}\right) Θ=atan2(Gy,Gx)
原理: 对图像像素作卷积。(实质:求梯度值) 各向同性Sobel算子: 由检测水平边缘和检测垂直边缘两个模板组成。位置加权系数更准确,在检测不同方向的边缘时提取的幅值一致。 G x = [ − 1 0 + 1 − 2 0 + 2 − 1 0 + 1 ] ∗ I G y = [ − 1 − 2 1 0 0 0 + 1 + 2 + 1 ] ∗ I \mathbf {G}_x=\begin{bmatrix} -1 & 0 & +1\\ -2 & 0 & +2 \\ -1 & 0 & +1 \end{bmatrix}* I \qquad \mathbf {G}_y=\begin{bmatrix} -1 & -2 & 1\\ 0 & 0 & 0 \\ +1 & +2 & +1 \end{bmatrix}*I Gx=⎣⎡−1−2−1000+1+2+1⎦⎤∗IGy=⎣⎡−10+1−20+210+1⎦⎤∗I G = G x 2 + G y 2 \mathbf {G}=\sqrt{\mathbf {G}_x^2+\mathbf {G}_y^2} G=Gx2+Gy2 G = ∣ G x ∣ + ∣ G y ∣ \mathbf {G}=|\mathbf {G}_x|+|\mathbf {G}_y| G=∣Gx∣+∣Gy∣
import cv2 import numpy as np img = cv2.imread("Img.png") gray_img = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY) sobel = cv2.Sobel(gray_img, cv2.CV_64F, 0, 1) cv2.imshow("sobel", sobel)Sobel方法参数:
Sobel(src.ddepth, dx, dy, ksize=None, scale=None, delta=None, borderType=None)ddepth: 深度类型,通常用cv2.CV_64F表示64位浮点数即64 float。 dx:x方向的导数,1表示取导,0表示不取导。 dy: y方向的导数,1表示取导,0表示不取导。 ksize: 卷积核的大小。
使用最广泛的边缘检测算法之一
步骤:
使用高斯滤波器,以平滑图像,滤除噪声;计算图像中每个像素点的梯度强度及方向;应用非极大值抑制,消除边缘带来的杂散效应;应用双阈值检测来确定真实及潜在的边缘;通过抑制孤立的弱边缘最终完成边缘检测。算法:
一般用 3 × 3 3\times 3 3×3或 5 × 5 5\times 5 5×5的高斯滤波核来平滑图像,滤波核的数值呈高斯分布。 尺寸为 ( 2 k + 1 ) × ( 2 k + 1 ) (2k+1)\times (2k+1) (2k+1)×(2k+1)的高斯卷积核公式: H i j = 1 2 π σ 2 exp ( − ( i − ( k + 1 ) ) 2 + ( j − ( k + 1 ) ) 2 2 σ 2 ) ; 1 ≤ i , j ≤ ( 2 k + 1 ) { H_{ij}={\frac {1}{2\pi \sigma ^{2}}}\exp \left(-{\frac {(i-(k+1))^{2}+(j-(k+1))^{2}}{2\sigma ^{2}}}\right);\quad 1\leq i,j\leq (2k+1)} Hij=2πσ21exp(−2σ2(i−(k+1))2+(j−(k+1))2);1≤i,j≤(2k+1) 一个 5 × 5 5\times 5 5×5的示例高斯滤波器如下: B = 1 159 [ 2 4 5 4 2 4 9 12 9 4 5 12 15 12 5 4 9 12 9 4 2 4 5 4 2 ] \mathbf{B}= \frac{1}{159}\begin{bmatrix}2 & 4 & 5&4&2\\ 4&9&12&9&4\\ 5&12&15&12&5 \\ 4&9&12&9&4\\2 & 4 & 5&4&2 \end{bmatrix} B=1591⎣⎢⎢⎢⎢⎡245424912945121512549129424542⎦⎥⎥⎥⎥⎤ 高斯平滑计算 e \mathbf{e} e: e = H ∗ A = [ h 11 h 12 h 13 h 21 h 22 h 23 h 31 h 32 h 33 ] ∗ [ a b c d e f g h i ] = s u m ( [ a × h 11 b × h 12 c × h 13 d × h 21 e × h 22 f × h 23 g × h 31 h × h 32 i × h 33 ] ) \mathbf{e}=H* \mathbf{A} = \begin{bmatrix} h_{11} & h_{12} & h_{13}\\ h_{21} & h_{22} & h_{23}\\ h_{31} & h_{32} & h_{33}\end{bmatrix} *\begin{bmatrix} a&b&c\\d&e&f\\g&h&i \end{bmatrix}=sum\left( \begin{bmatrix} a\times h_{11} & b\times h_{12} & c\times h_{13}\\ d\times h_{21} & e\times h_{22} & f\times h_{23} \\ g\times h_{31} & h \times h_{32} & i \times h_{33} \end{bmatrix} \right) e=H∗A=⎣⎡h11h21h31h12h22h32h13h23h33⎦⎤∗⎣⎡adgbehcfi⎦⎤=sum⎝⎛⎣⎡a×h11d×h21g×h31b×h12e×h22h×h32c×h13f×h23i×h33⎦⎤⎠⎞ 注意:高斯卷积核大小的选择将影响Canny检测器的性能。尺寸越大,检测器对噪声的敏感度越低,但边缘检测的定位误差也将略有增加。一般情况下, 5×5 大小的卷积核都是不错的选择.计算像素梯度的幅值以及方向,常用算子有Roberts、Sobel,计算水平及垂直方向的差分。找出梯度较大的区域,这部分区域属于图像增强的区域,此时得到的边缘信息比较粗大。 G = G x 2 + G y 2 {\displaystyle \mathbf {G} = {\sqrt {{\mathbf {G} _ {x}} ^ {2} + {\mathbf {G} _ {y}} ^ {2}}}} G=Gx2+Gy2 同理, 可计算梯度的方向: Θ = atan2 ( G y , G x ) \mathbf {\Theta } =\operatorname {atan2} \left({\mathbf {G} _{y},\mathbf {G} _{x}}\right) Θ=atan2(Gy,Gx)非极大值抑制 非极大值抑制是一种边缘稀释方法, 用于查找强度值变化最大的位置。渐变图像中每个像素的算法为: 将当前像素的边缘强度与像素在正和负渐变方向上的边缘强度进行比较,如果当前像素的边缘强度与掩模中具有相同方向的其他像素相比最大(例如,指向y方向的像素将与垂直轴上和下方的像素进行比较),则将保留该值。否则,该值将被抑制。在某些实现中,该算法将连续的梯度方向分类为一小组离散方向,然后将3x3滤波器移至上一步的输出(即边缘强度和梯度方向)上。在每个像素处,如果其大小不大于梯度方向上两个相邻像素的大小,它将抑制中心像素的边缘强度(其值设置为0)。
例如,如果梯度方向近似为0°(即边缘在南北方向),则该点的渐变幅度大于东西方向像素的幅度,则认为该点在边缘, 如果梯度角度近似为90°,则该点的渐变幅度大于南北方向像素的幅度,则认为该点在边缘上, 如果梯度角度近似为135°,并且该点的梯度幅度大于西北和东南方向像素的幅度,则该点将视为在边缘上. 如果梯度角度近似为45°,并且该点的渐变幅度大于东北和西南像素的像素幅度,则该点将视为在边缘上。
在更精确的实施方式中,在横跨梯度方向的两个相邻像素之间使用线性插值。
例如,如果渐变角在89°和180°之间,则北像素和东北像素之间的渐变之间的插值将给出一个插值,而西南像素和西南像素之间的插值将给出另一个插值(使用最后一段)。中心像素处的梯度大小必须大于这两个值,才能将其标记为边缘。 注: 方向的符号无关紧要,即南北与南北相同,依此类推。
双阈值 双阈值技术:设定一个阈值上界和一个阈值下界,图像中的像素点若大于阈值上界,认定为边缘;小于阈值下界则认定必然非边缘;两者之间的认定为候选项,需进一步处理。磁滞边缘跟踪 到目前为止,强边缘像素肯定应包含在最终边缘图像中,因为它们是从图像的真实边缘中提取的。 但是,关于弱边缘像素会有一些不确定因素,因为这些像素可能由真实边缘提取,也可以由噪声/颜色变化中提取。 为了获得准确的结果,应消除由噪声或变色变化引起的弱边缘。 通常,在未连接噪声响应的情况下,由真实边缘引起的弱边缘像素将连接到强边缘像素。 为了跟踪边缘连接,通过查看弱边缘像素及其8个连接的邻域像素来进行斑点分析。 只要斑点中包含一个强边缘像素,该弱边缘点就可以被识别为应该保留的边缘点。效果:
有效减少噪音的影响;边缘处理的效果较好缺陷:
应用了高斯滤波器来平滑噪声,但也会平滑边缘,而且发生频率较高。这将增加丢失弱边缘的可能性,并增加结果中孤立边缘的出现。对于梯度幅度计算,传统Canny边缘检测算法使用2×2小邻域窗口中的中心来计算表示梯度幅度的有限差分平均值。该方法对噪声敏感,可以轻松检测出虚假边缘并丢失真实边缘。在传统Canny边缘检测算法中,将有两个固定的全局阈值来滤除错误边缘。但是,随着图像变得复杂,不同的局部区域将需要不同阈值才能准确找到真实边缘。另外,全局阈值是通过传统方法中的实验手动确定的,图像处理量较大时就会导致计算复杂。传统检测的结果无法对每个边缘的单响应达到令人满意的高精度 – 将会出现多点响应。传统Canny算子的改进将在另一篇博客中介绍.
参考: https://en.wikipedia.org/wiki/Canny_edge_detector