目录
图像梯度—Sobel算子
图像梯度—Scharr算子
图像梯度—laplacian算子
主要考虑两个方向:水平与竖直(右减左,下减上)
img=cv2.imread('pie.png',cv2.IMREAD_GRAYSCALE)
cv2.imshow("img",img)
cv2.waitKey()
cv2.destroyAllWindows()
dst=cv2.Sobel(src,ddepth,dx,dy,ksize)
def cv_show(img,name):
cv2.imshow(name,img)
cv2.waitKey()
cv2.destroyAllWindows()
#cv2.CV_64F:由于右减左,下减上可能会出现负值,而opencv中负值是被截断成0的,这里是使用一种位数较高的方法来显示负值。
sobelx=cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)
cv_show(sobelx,'sobelx')
白点为边界处,相当于是有梯度的位置。但是发现右边没有白色边界,因为梯度值为负数显现不出来(白-黑为正,黑-白为负),所以需要进行取绝对值变为正数。
sobelx=cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)
sobelx=cv2.convertScaleAbs(sobelx) #算负数的绝对值
cv_show(sobelx,'sobely')
执行之后的图形
接下来执行dy上的操作
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')
不建议直接计算dx,dy
sobelxy=cv2.Sobel(img,cv2.CV_64F,1,1,ksize=3)
若按照上面式子直接计算Gx,Gy,则会出现重影,如下
下面使用lena图像进行操作
img=cv2.imread('lena.jpg',cv2.IMREAD_GRAYSCALE)
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')
原始图像与处理后的图像对比
下面采用直接计算
img=cv2.imread('lena.jpg',cv2.IMREAD_GRAYSCALE)
sobelxy=cv2.Sobel(img,cv2.CV_64F,1,1,ksize=3)
sobelxy=cv2.convertScaleAbs(sobelxy)
cv_show(sobelxy,'sobelxy')
重影,模糊
与sobel算子相比,数值变的更大了一些,对结果的差异更敏感
对于一些变换更敏感,对一些噪音点更敏感,不一定是好事,经常和其他的工具结合使用。
该算子使中间的点与其边缘点进行比较,因为周边是四个点,所以中间指定为-4
下面为三种算子之间的图像对比
img=cv2.imread('lena.jpg',cv2.IMREAD_GRAYSCALE)
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)
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,lapacian))
cv_show(res,'res')
scharr算子更敏感,对于图像的描述更加细腻更丰富一些