python图像边缘opencv谋条边长_OpenCV-Python-图像梯度与边缘检测

本文介绍了使用Python和OpenCV进行图像边缘检测的方法,包括图像梯度、Sobel算子、Prewitt算子以及Laplacian算子的应用。通过卷积核和差分计算,提取图像的垂直和水平边缘,展示了Sobel算子的简单实现,并对比了不同算子的效果。
摘要由CSDN通过智能技术生成

一、图像梯度

我们知道一阶导数可以用来求极值。把图片想象成连续函数,因为边缘部分的像素值与旁边的像素明显有区别,所以对图片局部求极值,就可以得到整幅图片的边缘信息。不过图片是二维的离散函数,导数就变成了差分,这个查分就变成了图像梯度。

1. 垂直边缘提取

滤波是应用卷积来实现的,卷积的关键就是卷积核。我们来考察下面这个卷积核:

20190414123626659486.png

这个核是用来提取图片中的垂直边缘的,怎么做到的呢?看下图:

20190414123627014932.jpg

当前列左右两侧的元素进行差分,由于边缘的值明显小于(或大于)周边像素,所以边缘的差分结果会明显不同,这样就提取出垂直边缘。同理,把上面的那个矩阵转置一下,就是提取水平边缘。这种差分操作就成为图像的梯度计算:

20190414123627099887.png

importcv2importnumpy as np

img= cv2.imread(‘sudoku.jpg‘, 0)#自己进行垂直边缘提取

kernel = np.array([[-1, 0, 1],

[-2, 0, 2],

[-1, 0, 1]], dtype=np.float32)

dst_v= cv2.filter2D(img, -1, kernel)#自己进行水平边缘提取

dst_h = cv2.filter2D(img, -1, kernel.T)#横向并排对比显示

cv2.imshow(‘edge‘, np.hstack((img, dst_v, dst_h)))

cv2.waitKey(0)

20190414123627174101.jpg

2. Sobel算子

上面这种差分方法就叫Sobel算子,它先在垂直方向上计算梯度 Gx = k1 x src,再在水平方向计算梯度Gy = k2 x src,最后求出总梯度:

20190414123627415297.png

我们可以把前面的代码用Sobel算子更简单的实现:

sobelx = cv2.Sobel(img, -1, 1, 0, ksize=3) #只计算x方向

sobely = cv2.Sobel(img, -1, 0, 1, ksize=3) #只计算y方向#横向并排对比显示

cv2.imshow(‘edge‘, np.hstack((img, sobelx, sobely)))

cv2.waitKey(0)

还有其他算子,比如只利用领域间的原始差值来检测边缘的Prewitt算子

20190414123627501229.png

还有比Sobel更好用的Scharr算子

20190414123627814685.png这些算法都是一阶边缘检测的代表。

3. Laplacian算子

高数中用一阶导数求极值,在这些极值的地方,二阶导数为0,所以也可以求二阶导计算梯度:

20190414123627899641.png

一维的一阶和二阶差分公式分别为:

20190414123628307818.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值