OpenCV——实验结果输出《图像梯度》算子

1.Sobel算子

2.Scharr算子(不常用)

3.laplacian算子(不常用)

4.Canny边缘检测

#============================图像梯度-Sobel算子============================
img = cv2.imread('./lena.jpg',cv2.IMREAD_GRAYSCALE)#读如灰色图像
sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)#对x上求梯度
sobelx = cv2.convertScaleAbs(sobelx)#使用线性变换转换输入数组元素成8位无符号整型
sobely = cv2.Sobel(img,cv2.CV_64F,0,1,ksize=3)#对y上求梯度
sobely = cv2.convertScaleAbs(sobely)#用于实现对整个图像数组中的每一个元素
sobelxy = cv2.addWeighted(sobelx,0.5,sobely,0.5,0)#合并梯度
res = np.hstack((img,sobelxy))
# cv_show('res',res)
#============================图像梯度-Scharr算子============================
scharrx = cv2.Scharr(img,cv2.CV_64F,1,0)
scharry = cv2.Scharr(img,cv2.CV_64F,0,1)
scharrx = cv2.convertScaleAbs(scharrx)
scharry = cv2.convertScaleAbs(scharry)
scharrxy =  cv2.addWeighted(scharrx,0.5,scharry,0.5,0)
#============================图像梯度-laplacian算子============================
laplacian = cv2.Laplacian(img,cv2.CV_64F)
laplacian = cv2.convertScaleAbs(laplacian)
res = np.hstack((img,sobelxy,scharrxy,laplacian))
cv_show('res',res)
#============================Canny边缘检测============================
img=cv2.imread("lena.jpg",cv2.IMREAD_GRAYSCALE)
v1=cv2.Canny(img,80,150)
v2=cv2.Canny(img,50,100)#设置的是双边阈值
res = np.hstack((img,v1,v2))
cv_show('res',res)

这个图显示的是Sobel、Scharr、拉普拉斯算子的结果
请添加图片描述
这个图显示的是Canny边缘检测
请添加图片描述
对于边缘提取算法,我们一般采用Sobel算子检测方法和Canny算法,

Sobel算子对灰度渐变,多噪声图片处理效果很好,但对边缘定位精度较差,即定位不准确(大多数边缘不止一个像素);

Canny算法不容易受到噪声干扰,利用强弱边缘,即弱边缘和强边缘相连时,才将弱边缘考虑,从而容易检测到真正的边缘,即定位精度比较高.

精度要求不高可以考虑Sobel边缘提取方法, 反之考虑Canny边缘提取方法,还熟悉Laplance算子,由于对噪声比较敏感,常不用在边缘检测上

参考链接
https://blog.csdn.net/Mrsherlock_/article/details/109555748

猜你喜欢

转载自blog.csdn.net/guoguozgw/article/details/131330809