赞
踩
这一节我们来看一下计算图像边缘的一些算子,提取图像边缘的信息有利于之后对图像中的物品进行更进一步的处理。
G
x
=
[
−
1
0
1
−
2
0
2
−
1
0
1
]
,
G
y
=
[
−
1
−
2
−
1
0
0
0
1
2
1
]
G_{x}=
我们首先来看以下我们需要处理的图片:
img = cv2.imread('pie.png',cv2.IMREAD_GRAYSCALE)
cv2.imshow("img",img)
cv2.waitKey(0)
cv2.destroyAllWindows()
这里我们写一个显示图像的函数,方便之后的调用。
def cv_show(img,name):
cv2.imshow(name,img)
cv2.waitKey()
cv2.destroyAllWindows()
这里我们沿着水平方向对其进行一下梯度的提取
sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)
cv_show(sobelx,'sobelx')
白到黑是正数,黑到白就是负数了,所有的负数会被截断成0,所以要取绝对值。
sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)
sobelx = cv2.convertScaleAbs(sobelx)
cv_show(sobelx,'sobelx')
结果显示如下图所示:
cv2.Sobel
函数的参数:
dst = cv2.Sobel(src, ddepth, dx, dy, ksize)
再看一下沿着竖直方向的:
sobely = cv2.Sobel(img,cv2.CV_64F,0,1,ksize=3)
sobely = cv2.convertScaleAbs(sobely)
cv_show(sobely,'sobely')
分别计算x和y,再求和:
sobelxy = cv2.addWeighted(sobelx,0.5,sobely,0.5,0)
cv_show(sobelxy,'sobelxy')
不建议直接计算:
sobelxy=cv2.Sobel(img,cv2.CV_64F,1,1,ksize=3)
sobelxy = cv2.convertScaleAbs(sobelxy)
cv_show(sobelxy,'sobelxy')
图像梯度-Scharr算子,能够捕获更加细致的纹理信息。
G
x
=
[
−
3
0
3
−
10
0
10
−
3
0
3
]
,
G
y
=
[
−
3
−
10
−
3
0
0
0
3
10
3
]
G_{x}=
图像梯度-laplacian算子:
G
=
[
0
1
0
1
−
4
1
0
1
0
]
G=
我们也可以查看一下各种不同算子之间的差异:
#不同算子的差异 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')
结果显示如下图所示:
我的微信公众号名称:小小何先生
公众号介绍:主要研究分享深度学习、机器博弈、强化学习等相关内容!期待您的关注,欢迎一起学习交流进步!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。