python实现canny边缘检测
canny边缘检测原理
canny边缘检测共有5部分组成,下边我会分别来介绍。
1 高斯模糊(略)
2 计算梯度幅值和方向。
可选用的模板:soble算子、prewitt算子、roberts模板等等;
一般采用soble算子,opencv也是如此,利用soble水平和垂直算子与输入图像卷积计算dx、dy:
进一步可以得到图像梯度的幅值:
为了简化计算,幅值也可以作如下近似:
角度为:
如下图表示了中心点的梯度向量、方位角以及边缘方向(任一点的边缘与梯度向量正交) :
θ = θm = arctan(dy/dx)(边缘方向)
α = θ + 90= arctan(dy/dx) + 90(梯度方向)
3、根据角度对幅值进行非极大值抑制
划重点:是沿着梯度方向对幅值进行非极大值抑制,而非边缘方向,这里初学者容易弄混。
例如:3*3区域内,边缘可以划分为垂直、水平、45°、135°4个方向,同样,梯度反向也为四个方向(与边缘方向正交)。因此为了进行非极大值,将所有可能的方向量化为4个方向,如下图:
即梯度方向分别为
α = 90
α = 45
α = 0
α = -45
非极大值抑制即为沿着上述4种类型的梯度方向,比较3*3邻域内对应邻域值的大小:
在每一点上,领域中心 x 与沿着其对应的梯度方向的两个像素相比,若中心像素为最大值,则保留,否则中心置0,这样可以抑制非极大值,保留局部梯度最大的点,以得到细化的边缘。
4、用双阈值算法检测和连接边缘
1选取系数th和tl,比率为2:1或3:1。(一般取th=0.3或0.2,tl=0.1);
2 将小于低阈值的点抛弃,赋0;将大于高阈值的点立即标记(这些点为确定边缘 点),赋1或255;
3将小于高阈值,大于低阈值的点使用8连通区域确定(即:只有与th像素连接时才会被接受,成为边缘点,赋 1或255)
python 实现
运行结果如下
以上就是python实现canny边缘检测的详细内容,更多关于canny边缘检测的资料请关注其它相关文章!