opencv图像处理⑤

目录

图像梯度—Sobel算子

图像梯度—Scharr算子

图像梯度—laplacian算子 


 

图像梯度—Sobel算子

主要考虑两个方向:水平与竖直(右减左,下减上)

opencv图像处理⑤_第1张图片

 img=cv2.imread('pie.png',cv2.IMREAD_GRAYSCALE)

cv2.imshow("img",img)

cv2.waitKey()

cv2.destroyAllWindows()

dst=cv2.Sobel(src,ddepth,dx,dy,ksize)

  • src:当前图像 
  • ddepth:图像的深度(通常情况下指定为-1)
  • dx和dy分别表示水平和竖直方向
  • ksize是Sobel算子的大小(通常为3*3的)

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')

opencv图像处理⑤_第2张图片

 白点为边界处,相当于是有梯度的位置。但是发现右边没有白色边界,因为梯度值为负数显现不出来(白-黑为正,黑-白为负),所以需要进行取绝对值变为正数。

sobelx=cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)

sobelx=cv2.convertScaleAbs(sobelx)   #算负数的绝对值

cv_show(sobelx,'sobely')

 

opencv图像处理⑤_第3张图片

 执行之后的图形

 接下来执行dy上的操作

sobely=cv2.Sobel(img,cv2.CV_64F,0,1,ksize=3)

sobely=cv2.convertScaleAbs(sobely) 

cv_show(sobely,'sobely')

opencv图像处理⑤_第4张图片

执行后的图像 

分别计算x和y,再求和 

sobelxy=cv2.addWeighted(sobelx,0.5,sobely,0.5,0)  #按权重计算求和

cv_show(sobelxy,'sobelxy') 

opencv图像处理⑤_第5张图片

 不建议直接计算dx,dy

 sobelxy=cv2.Sobel(img,cv2.CV_64F,1,1,ksize=3)

若按照上面式子直接计算Gx,Gy,则会出现重影,如下

 

opencv图像处理⑤_第6张图片


下面使用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')

  opencv图像处理⑤_第7张图片opencv图像处理⑤_第8张图片

原始图像与处理后的图像对比 

 下面采用直接计算

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')

 

opencv图像处理⑤_第9张图片

 重影,模糊

 

图像梯度—Scharr算子

与sobel算子相比,数值变的更大了一些,对结果的差异更敏感 

opencv图像处理⑤_第10张图片 

图像梯度—laplacian算子 

 对于一些变换更敏感,对一些噪音点更敏感,不一定是好事,经常和其他的工具结合使用。

该算子使中间的点与其边缘点进行比较,因为周边是四个点,所以中间指定为-4

opencv图像处理⑤_第11张图片

下面为三种算子之间的图像对比 

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')

opencv图像处理⑤_第12张图片

 scharr算子更敏感,对于图像的描述更加细腻更丰富一些

 

 

你可能感兴趣的:(opencv,opencv,图像处理,计算机视觉)