Canny边缘检测首先要对图像进行高斯去噪,因为前面预处理对图像进行了去噪处理,所以可以直接对图像灰度进行微分运算。微分运算常用的方法是利用模板算子,把模板中心对应到图像的每一个像素位置,然后按照模板对应的公式对中心像素和它周围的像素进行数学运算,算出图像对应像素点的值实验中模板矩阵选取了Laplacian算子[44]、Soble算子、Roberts算子。拉普拉兹算子是2阶微分算子,它的精度还算比较高,但对噪声过于敏感,有噪声的情况下效果很差。罗伯特算子在光照不均匀时候效果也很差,针对噪声影响也较为敏感。下面以较为简单的模板作为样例做出讲解:
1、计算x和y方向的梯度值从而得到灰度的梯度幅值和梯度方向
Gx=(hd[x][y+1]-hd[x][y]+hd[x+1][y+1]-hd[x+1][y])/2;
Gy=(hd[x][y]-hd[x+1][y]+hd[x][y+1]-hd[x+1][y+1])/2;
G[x][y]=(int)Math.sqrt(Gy*Gy+Gx*Gx);
angle[x][y]=Math.atan2(Gy,Gx);
2、高低阈值的选取。通常canny算子的高阈值Th和低阈值Tl的0.4,Tl=0.4*Th,而高阈值根据二值化的目的选择不同的值,先验知识通常Th选择:梯度幅值矩阵统计在梯度值为前q%(q%在0.75-0.85之间)的那个振幅值作为高阈值。将低于低阈值的点视为非边缘点置为0,大于等于高阈值的视为边缘点255,将介于高低阈值之间的为待检测的点125。
3、非极大值抑制,这是边缘检测的关键,是将区域内的梯度振幅值的极值当作边缘点,如下图:
对整个梯度振幅图扫描,如图若(x,y)的点大于p点和m的振幅则将(x,y)视为边缘点,将起值置为255。由图可以看出p点振幅值可以tan(sigma)*(G(x+1,y)-G(x,y))同理可以得到m点的梯度振幅值。
4、再梯度振幅里对刚刚上一步视为边缘点的8领域进行扫描,若大于等于Th的则视为边缘点置为255,将低于Tl的直接置为0视为非边缘点大于Tl的置为125,带检测点。
5、边缘连接再对上一部得到的图像进行扫描,将255周围的8领域点进行检测,若有为125的视为边缘点,置为255,再以这些新置为255的点8领域查找待检测点,若有就将其置为255,直到没有新的边缘点产生为止。