opencv——图像梯度计算

    • Sobel算子

步骤1:读取原图像

import cv2
img=cv2.imread("pie.png",cv2.IMREAD_GRAYSCALE)
cv2.imshow("img",img)
cv2.waitKey()
cv2.destroyAllWindows()
opencv——图像梯度计算_第1张图片

ps:梯度是指图像某一个像素点两边的颜色差异值,两边颜色相同的像素点梯度为0,所以只有边界像素点才有梯度。

步骤2:Sobel算子计算图像梯度

opencv——图像梯度计算_第2张图片

是指水平方向色差,是指竖直方向色差,

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,即为黑,因此需要对其取绝对值。

    • scharr算子

opencv——图像梯度计算_第3张图片

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
    • laplacian(拉普拉斯)算子

opencv——图像梯度计算_第4张图片

ps:拉普拉斯算子运用到二阶导,与前面两种算子来说更加敏感,但对噪音点也更加敏感。

laplacian=cv2.Laplacian(img,cv2.CV_64F)
laplacian=cv2.convertScaleAbs(laplacian)
cv_show(laplacian,"laplacian")
    • Sobel、Scharr、Laplacian三种算子计算梯度间的效果比较

import numpy as np
res=np.hstack(sobelxy,scharrxy,laplacian)
cv_show(res,"res")

a、scharr算子对边界像素描述要比sobel算子更加细致,可以获得更加丰富的边界信息。

b、laplacian算子因为对噪音更加敏感,描述边界像素的效果不是特别好,因此一般不单独使用laplacian算子

你可能感兴趣的:(opencv,opencv,计算机视觉,python)