【OpenCV Python】核心操作--边缘检测

边缘检测其实就是利用一个高通滤波器和图像进行卷积,图像中的边缘(即高频部分)在滤波器   的作用下,保留高频部分,也就是留下边缘

   或者换一个角度考虑,对图像进行X方向和Y方向的差分,在图像的边缘差分结果会比别的地方大,再利用差分可以计算出梯度,边缘总会出现在梯度最大的地方

1.几个基本算子

常用的边缘检测算子有sobel, scharr, laplacian算子,这几个算子本质上都是高通滤波器,使用这些算子和图像卷积即可获得图像边缘图形。

Sobel算子如下:


屏幕剪辑的捕获时间:2018/4/13 20:2

Scharr算子如下:


屏幕剪辑的捕获时间:2018/4/13 20:29

 

Laplacian算子如下:


屏幕剪辑的捕获时间:2018/4/13 20:30

 

opencv分别提供一下三个函数进行sobel,scharr ,laplacian运算

 

Cv2.sobel( src, ddepth,dx,dy, ksize)

  ddepth表示输出图像的数据类型,选择-1时表示和原图一致

  dx ,dy表示对该方向进行几阶导, 一般可以选择0,1,2

  ksize表示卷积核的大小

Cv2.scharr( src, ddepth, dx, dy, ksize)参数和上面一样

 

Cv2.laplacian(src, ddepth)参数和上面一样

例子:

 

img = cv2.imread("lena.jpg",0)

dstx = cv2.Sobel(img,-1,1,0,ksize=5)

dsty = cv2.Sobel(img,-1,0,1,ksize=5)

lap =cv2.Laplacian(img,-1)


 

 

注:

1使用这几个算子,其本质上还是卷积,所以,如果使用filter2D函数直接将图像和算子进行2D卷积,其结果和直接使用算子并没有什么不同

例如:

 

kernel= np.matrix('0 1 0; 1 -4 1; 0 1 0')

lap=cv2.Laplacian(img,-1)

test= cv2.filter2D(img, -1 ,kernel)

 


 

屏幕剪辑的捕获时间:2018/4/13 21:19

 

 

2使用sobel算子时有个问题,对于我们常用的RGB格式图片,存储一种颜色用的是8bit存储,所以在做从高到低的差分时,比如白色到黑色,算出来的差分是负数,而对于RGB通道的图片,负数溢出没有意义,所以会出现从高到低差分bug,如下所示:

img = cv2.imread("edge.png",0)

sobelx =cv2.Sobel(img, -1, 1, 0, ksize=5)


 

屏幕剪辑的捕获时间:2018/4/13 22:01

 

解决办法如下:

sobel算子的数据格式,换到更大的,比如cv2.CV_64F,再计算 带负数的结果 的绝对值,再将这个绝对值转回到8bit的格式。如下所示:

img =cv2.imread("edge.png",0)

sobelx=cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=5)

sobelx=np.absolute(sobelx)

sobelx=np.uint8(sobelx)

 

屏幕剪辑的捕获时间:2018/4/13 22:06

 

2.Canny检测

canny检测是一套成熟的边缘检测算法,其具体实现方法此处不进行分析,只说一下大概

1)噪声去除,可以使用高斯滤波器去除噪声

2)计算图像梯度,利用sobel算子分别计算x,y方向的导数,再计算出梯度

3)非极大值移植,逐个扫描每个像素的梯度,如果一个像素的梯度是两边最大的,则保        留,如果不是则去除

4)滞后阈值,设置一组阈值maxValminVal,在阈值之外的部分去除,所以阈值的选取非常重要

 

opencv直接提供cv2.canny(src,minVal, maxVal, apertureSize, L2gradient)函数来进行canny检测。其中ksize是卷积核大小,L2gradient用于设定求梯度大小的方程

如果为True,计算方程为:

  

如果为False,计算方程为:

  

例子:

img = cv2.imread("lena.jpg",0)

canny=cv2.Canny(img,100,1000,apertureSize=5,L2gradient=True)

  

屏幕剪辑的捕获时间: 2018/4/13 22:25

 

 

 

 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值