import cv2
img=cv2.imread("pie.png",cv2.IMREAD_GRAYSCALE)
cv2.imshow("img",img)
cv2.waitKey()
cv2.destroyAllWindows()
ps:梯度是指图像某一个像素点两边的颜色差异值,两边颜色相同的像素点梯度为0,所以只有边界像素点才有梯度。
是指水平方向色差,是指竖直方向色差,
def cv_show(img,name):
cv2.imshow(name,img)
cv2.waitKey()
cv2.destrayAllWindows()
#水平方向x的sobel梯度
sobelx=cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)#从左到右参数分别为原图像,图像深度ddepth,水平方向x,竖直方向dy,sobel模板的尺寸
sobelx=cv2.convertScaleAbs(sobelx)
cv_show(sobelx,"sobelx")
#竖直方向y的sobel梯度
sobely=cv2.Sobel(img,cv2.CV_64F,0,1,ksize=3)
sobely=cv2.convertScaleAbs(sobely)
cv_show(sobely,"sobely")
#水平方向x和竖直方向y的sobel梯度和
sobelxy=cv2.addWeighted(sobelx,0.5,sobely,0.5,0)
cv_show(sobelxy,"sobelxy")
ps:白-黑是正数,黑-白就为负数,但在opencv里负数会被截断为0,即为黑,因此需要对其取绝对值。
ps:scharr模板比sobel模板对梯度更加敏感。
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)
cv_show(scharrxy,"scharrxy"0
ps:拉普拉斯算子运用到二阶导,与前面两种算子来说更加敏感,但对噪音点也更加敏感。
laplacian=cv2.Laplacian(img,cv2.CV_64F)
laplacian=cv2.convertScaleAbs(laplacian)
cv_show(laplacian,"laplacian")
import numpy as np
res=np.hstack(sobelxy,scharrxy,laplacian)
cv_show(res,"res")
a、scharr算子对边界像素描述要比sobel算子更加细致,可以获得更加丰富的边界信息。
b、laplacian算子因为对噪音更加敏感,描述边界像素的效果不是特别好,因此一般不单独使用laplacian算子