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 = cv2.imread("pie.png",cv2.IMREAD_GRAYSCALE)
cv_show("img",img)
plt.imshow(img)
<matplotlib.image.AxesImage at 0x1f6e49302b0>
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>
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>
分别计算x和y,再求和
sobelxy = cv2.addWeighted(sobelx,0.5,sobely,0.5,0)
cv_show("sobelxy",sobelxy)
plt.imshow(sobelxy)
<matplotlib.image.AxesImage at 0x1f6f78cd400>
直接计算,效果一般般
sobelxy=cv2.Sobel(img,cv2.CV_64F,1,1,ksize=3)
cv_show("sobelxy",sobelxy)
plt.imshow(sobelxy)
<matplotlib.image.AxesImage at 0x1f6e3f0f208>
# 例子
img = cv2.imread("lena.jpg",cv2.IMREAD_GRAYSCALE)
cv_show("img",img)
plt.imshow(img)
<matplotlib.image.AxesImage at 0x1f6e441b048>
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>
2 图像梯度-Scharr算子
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>