import cv2
import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline
def cv_show(name,img):
cv2.imshow(name,img)
cv2.waitKey(0)
cv2.destroyAllWindows()
1 图像梯度-Sobel算子
![[外链图片转存失败(img-kxijQeIx-1565701492632)(sobel_1.png)]](https://i-blog.csdnimg.cn/blog_migrate/d5b7b28725f14e80db7fb97928a2fe84.png)
img = cv2.imread("pie.png",cv2.IMREAD_GRAYSCALE)
cv_show("img",img)
plt.imshow(img)
<matplotlib.image.AxesImage at 0x1f6e49302b0>
![[外链图片转存失败(img-hEQMo4sB-1565701492633)(output_3_1.png)]](https://i-blog.csdnimg.cn/blog_migrate/6db5838691c78dc603467f76702e0f32.png)
dst = cv2.Sobel(src, ddepth, dx, dy, ksize)
-
ddepth:图像的深度
-
dx和dy分别表示水平和竖直方向
-
ksize是Sobel算子的大小
sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)
sobelx = cv2.convertScaleAbs(sobelx)
cv_show("sobelx",sobelx)
plt.imshow(sobelx)
<matplotlib.image.AxesImage at 0x1f6e7a06978>
![[外链图片转存失败(img-50eXFf9D-1565701492633)(output_5_1.png)]](https://i-blog.csdnimg.cn/blog_migrate/a3fe4e165be6b124ba2225cb5cdcfa70.png)
sobely = cv2.Sobel(img,cv2.CV_64F,0,1,ksize=3)
sobely = cv2.convertScaleAbs(sobely)
cv_show("sobely",sobely)
plt.imshow(sobely)
<matplotlib.image.AxesImage at 0x1f6f7cb80f0>
![[外链图片转存失败(img-DCpuPjrW-1565701492634)(output_6_1.png)]](https://i-blog.csdnimg.cn/blog_migrate/77155272fc1fb7064acab0e2d95ecd2c.png)
分别计算x和y,再求和
sobelxy = cv2.addWeighted(sobelx,0.5,sobely,0.5,0)
cv_show("sobelxy",sobelxy)
plt.imshow(sobelxy)
<matplotlib.image.AxesImage at 0x1f6f78cd400>
![[外链图片转存失败(img-TrDMMDed-1565701492635)(output_8_1.png)]](https://i-blog.csdnimg.cn/blog_migrate/c6c6d4427549cf5a7c23b530408e860f.png)
直接计算,效果一般般
sobelxy=cv2.Sobel(img,cv2.CV_64F,1,1,ksize=3)
cv_show("sobelxy",sobelxy)
plt.imshow(sobelxy)
<matplotlib.image.AxesImage at 0x1f6e3f0f208>
![[外链图片转存失败(img-3EnyfMVq-1565701492636)(output_10_1.png)]](https://i-blog.csdnimg.cn/blog_migrate/fdbc8b8919248261ac984b313f73fe25.png)
# 例子
img = cv2.imread("lena.jpg",cv2.IMREAD_GRAYSCALE)
cv_show("img",img)
plt.imshow(img)
<matplotlib.image.AxesImage at 0x1f6e441b048>
![[外链图片转存失败(img-Ht1p96dO-1565701492636)(output_11_1.png)]](https://i-blog.csdnimg.cn/blog_migrate/3345622fd59774c116570f8193da7ce6.png)
sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)
sobelx = cv2.convertScaleAbs(sobelx)
sobely = cv2.Sobel(img,cv2.CV_64F,0,1,ksize=3)
sobely = cv2.convertScaleAbs(sobely)
sobelxy = cv2.addWeighted(sobelx,0.5,sobely,0.5,0)
cv_show("sobelxy",sobelxy)
plt.imshow(sobelxy)
<matplotlib.image.AxesImage at 0x1f6e77a0668>
![[外链图片转存失败(img-1lri2PUd-1565701492637)(output_12_1.png)]](https://i-blog.csdnimg.cn/blog_migrate/5f3e67cd4125bb231f387ede09f867ca.png)
2 图像梯度-Scharr算子
![[外链图片转存失败(img-hDqDwSGQ-1565701492638)(scharr.png)]](https://i-blog.csdnimg.cn/blog_migrate/7c3cd98d7e8a227ed95574ad61fda05f.png)
3 图像梯度-laplacian算子

#不同算子的差异
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)
laplacian = cv2.convertScaleAbs(laplacian)
res = np.hstack((sobelxy,scharrxy,laplacian))
cv_show("res",res)
plt.imshow(res)
<matplotlib.image.AxesImage at 0x1f6e78c1780>
![[外链图片转存失败(img-KPLXzyD0-1565701492640)(output_18_1.png)]](https://i-blog.csdnimg.cn/blog_migrate/34617cd281f5300b5be2e3a8ec275517.png)
本文详细介绍了使用Sobel算子、Scharr算子和Laplacian算子进行图像梯度计算的方法,展示了如何通过这些算子检测图像中的边缘,并比较了不同算子在边缘检测效果上的差异。
357

被折叠的 条评论
为什么被折叠?



