cv2.Canny()
主要包括四个部分
- 使用高斯滤波去除图像噪声
- 计算梯度的幅度与方向
- 非极大抑制,即适当地让边缘"变瘦"
- 确定边缘,使用双阈值算法确定最终的边缘信息
1.应用高斯滤波去除图像噪声
滤波的目的是平滑一些纹理较弱的非边缘区域,以便得到更准确的边缘
2. 计算梯度
梯度方向总是与边缘方向是垂直的,计算梯度时会得到梯度的幅度和角度(代表梯度的方向),如(2,90)代表梯度的幅度为2,角度为90°
3. 非极大抑制
在获得了梯度的幅度和方向后,遍历图像中的像素点,去除所有非边缘的点,得到水平方向和垂直方向的最大值
- 如果该点是正/负梯度方向上的局部最大值,则保留该点
- 如果不是,则抑制该点
4. 应用双阈值确定边缘
完成上述步骤以后,图像内的强边缘已经在当前获取的边缘图像内,但是一些虚边缘可能也在边缘图像内。这些虚边缘可能是真实图像产生的,也有可能是噪声产生的。对于后者,必须剔除
若>=maxval,判定为强边缘
若>minval&&<maxval,判定为虚边缘
若<=minval判定为弱边缘
对于虚边缘需要进一步处理,一半通过判断虚边缘与强边缘是否连接,来确定虚边缘到底属于哪种情况
- 与强边缘连接,则将该边缘处理为边缘
- 与强边缘无连接,则该边缘为弱边缘,将其抑制
Canny函数及使用
使用不同点的阈值threshold1和threshold2
import cv2
img=cv2.imread('D:/hjb.jpg',cv2.IMREAD_GRAYSCALE)
cv2.imshow('img',img)
r1=cv2.Canny(img,128,200)
r2=cv2.Canny(img,32,128)
cv2.imshow('r1',r1)
cv2.imshow('r2',r2)
cv2.waitKey(0)
cv2.destroyWindow()
网友评论