其他分享
首页 > 其他分享> > OpenCV学习笔记(3图像梯度和边缘检测)

OpenCV学习笔记(3图像梯度和边缘检测)

作者:互联网

1.图像梯度(就是检测边缘)
Sobel算子
在这里插入图片描述
dst = cv2.Sobel(src, ddepth, dx, dy, ksize)
ddepth:图像的深度
dx和dy分别表示水平和竖直方向
ksize是Sobel算子的大小

sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)
cv_show(sobelx,'sobelx')

白到黑是正数,黑到白就是负数了,所有的负数会被截断成0,所以要取绝对值,用一个卷积核去一个一个乘,右边是正的,左边是负的,看哪边多,就厉害。

分别计算x和y,再求和,算的x上下有点空,算的y左右有点空,加起来就要均衡一些了。
sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)
sobelx = cv2.convertScaleAbs(sobelx)
cv_show(sobelx,'sobelx')
sobely = cv2.Sobel(img,cv2.CV_64F,0,1,ksize=3)
sobely = cv2.convertScaleAbs(sobely)  
cv_show(sobely,'sobely')
sobelxy = cv2.addWeighted(sobelx,0.5,sobely,0.5,0)
cv_show(sobelxy,'sobelxy')
#这是一起算x和y的,但是我们不建议这样计算,
sobelxy=cv2.Sobel(img,cv2.CV_64F,1,1,ksize=3)
sobelxy = cv2.convertScaleAbs(sobelxy) 
cv_show(sobelxy,'sobelxy')

Scharr算子(这个算子和上面的差距在于跨度更大,图像的线条更加明显,更亮一些)
在这里插入图片描述
laplacian算子(这个算子没有x和y方向了,他就是x和y方向的综合)
在这里插入图片描述

#不同算子的差异
img = cv2.imread('lena.jpg',cv2.IMREAD_GRAYSCALE)
sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)
sobely = cv2.Sobel(img,cv2.CV_64F,0,1,ksize=3)
sobelx = cv2.convertScaleAbs(sobelx)   
sobely = cv2.convertScaleAbs(sobely)  
sobelxy =  cv2.addWeighted(sobelx,0.5,sobely,0.5,0)  

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 = cv2.Laplacian(img,cv2.CV_64F)#不用x,y一起用的了。
laplacian = cv2.convertScaleAbs(laplacian)   
res = np.hstack((sobelxy,scharrxy,laplacian))
cv_show(res,'res')

2.Canny边缘检测(一步到位的边缘检测)

  1. 使用高斯滤波器,以平滑图像,滤除噪声。
  2. 计算图像中每个像素点的梯度强度和方向。
  3. 应用非极大值(Non-Maximum Suppression)抑制,以消除边缘检测带来的杂散响应。
  4. 应用双阈值(Double-Threshold)检测来确定真实的和潜在的边缘。
  5. 通过抑制孤立的弱边缘最终完成边缘检测。

1.高斯滤波器
在这里插入图片描述
2.梯度和方向
在这里插入图片描述
3.非极大值抑制(就是将极大值保留下来,极大值是边缘像素点的可能性极大,抑制就是舍弃)

在这里插入图片描述
这是一种简单的方法,能解决极大部分的问题。
在这里插入图片描述
4.双阈值检测(设一个小的,设一个大的,小于小的是0,大于大的是255,)
在这里插入图片描述

#一句话就解决了上面的所有问题,是不是很简单?
img=cv2.imread("lena.jpg",cv2.IMREAD_GRAYSCALE)
v1=cv2.Canny(img,80,150)
v2=cv2.Canny(img,50,100)
res = np.hstack((v1,v2))
cv_show(res,'res')
AVENGER辉 发布了61 篇原创文章 · 获赞 91 · 访问量 2万+ 私信 关注

标签:img,64F,梯度,cv2,sobelxy,笔记,OpenCV,sobely,sobelx
来源: https://blog.csdn.net/phthon1997/article/details/104092632