(一)先从感兴趣的边缘检测开始

边缘检测中,其中一阶边缘检测的算法有:prewitt、canny、sobel,二阶边缘检测算法有:laplace

1.Sobel边缘检测

sobel算子根据像素点的上下、左右邻点加权差,在边缘达到极值来达到边缘检测的目的。对噪声有平滑作用,可以提供较准确的边缘方向信息,但是对边缘检测的精度不高,适合于边缘检测精确要求不高的检测。

opencv 边缘检测 外接矩形 python opencv canny边缘检测算法_图像处理


opencv 边缘检测 外接矩形 python opencv canny边缘检测算法_高斯滤波_02


则x方向梯度进而计算

opencv 边缘检测 外接矩形 python opencv canny边缘检测算法_灰度_03

同理对y方向梯度进行计算,这里不写推导过程

opencv 边缘检测 外接矩形 python opencv canny边缘检测算法_图像处理_04

2..Canny边缘检测

canny检测的原理是:进行高斯滤波进行平滑;计算图像中每个像素点的方向和梯度;根据非极大值抑制,消除边缘检测带来的杂散响应;再根据双边阈值对真实潜在的边缘进行确定;通过阈值孤立弱边缘最终完成边缘检测。

(1)先进行高斯滤波

高斯滤波器与图像卷积,平滑滤除噪声,

这里高斯核的生成方程式为:

opencv 边缘检测 外接矩形 python opencv canny边缘检测算法_高斯滤波_05

,之后归一化高斯核

像素点的亮度值为 e = H * A。其中高斯滤波核的大小的选择影响canny的性能,尺寸越大对噪声的敏感度越低,但是定位误差会有所改善,其中5*5大小的不错。

(2)计算梯度的强度和方向

图像中的边缘可以指向各个方向,可以用边缘检测算子来返回边缘的值,如prewitt、sobel、robert等返回水平Gx和垂直Gy。sobel的处理方法可以像上面说的sobel检测那样计算点的像素值,Gx=Sx*A , Gy= Sy*A

(3)非极大值抑制

对于刚刚的梯度计算之后,边缘还是存在不清晰的现象,因此还需要进一步对边缘进行限定。非极大值抑制可以将局大值之外的抑制为0,具体的将当前像素强度的梯度与另外两个相比,它最大的话保留,小的话抑制。

opencv 边缘检测 外接矩形 python opencv canny边缘检测算法_灰度_06

如上图所示,c是我们进行判断去留的点,它的梯度方向是左图中的斜线方向。这里要比较的是斜线与上下直线相交的dTmp1以及dTmp2点的梯度。要计算dTmp1和dTmp2的梯度,找出c点中8邻域中靠近的4个点g1、g2、g3、g4。利用比例关系计算梯度

M(dTmp1)=w*M(g2)+(1-w)*M(g1) ,其中w=distance(dTmp1,g2)/distance(g1,g2)  ;同理算出dTmp2。这样比较之后判断是保留c点还是抑制c点。

(4)双边阈值

但是经过上面的极大值抑制后还是会存在噪声等干扰。因此这里用双边阈值来抑制。Canny算法利用双阈值,一个高阈值一个低阈值来区分边缘像素,如果边缘像素梯度大于高阈值,则为强边缘点,如果边缘像素梯度小于低阈值,则为弱边缘点。其中,弱边缘点被抑制掉。应该是因为噪声的干扰大多情况下没有真边缘表现的那么强的原因。

一般在双边阈值之后Canny边缘提取就结束了。但是其实在双边阈值中被抑制掉的弱边缘点可能是真的边缘,这样对边缘提取的准确性会有影响。这里还可以进行一步,滞后边界追踪,这里利用弱边缘点的8连通域像素来进行判断,如果8连通域内存在强边缘点,则弱边缘点被当作真的边缘点保留下来。

(二)再放一个阈值分割

1.大津阈值分割(最大类间方差法)

按灰度特性,将图像分成前景和目标。前景和目标的类间方差越大,则构成此图的两部分的差别越大。例记为ω0,其平均灰度μ0;背景像素点数占整幅图像的比例为ω1,其平均灰度为μ1。图像的总平均灰度记为μ,类间方差记为g。假设图像的背景较暗,并且图像的大小为M×N,图像中像素的灰度值小于阈值T的像素个数记作N0,像素灰度大于阈值T的像素个数记作N1,则有

                        ω0=N0/ M×N (1)
      ω1=N1/ M×N (2)
      N0+N1=M×N (3)
      ω0+ω1=1 (4)
      μ=ω0*μ0+ω1*μ1 (5)
      g=ω0(μ0-μ)^2+ω1(μ1-μ)^2 (6)