opencv图像处理⑤

目录

 

图像梯度—Sobel算子

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

opencv图像处理⑤

 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图像处理⑤

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

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

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

cv_show(sobelx,’sobely’)

 

opencv图像处理⑤

 执行之后的图形

 接下来执行dy上的操作

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

sobely=cv2.convertScaleAbs(sobely) 

cv_show(sobely,’sobely’)

opencv图像处理⑤

执行后的图像 

分别计算x和y,再求和 

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

cv_show(sobelxy,’sobelxy’) 

opencv图像处理⑤

 不建议直接计算dx,dy

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

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

 

opencv图像处理⑤

下面使用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图像处理⑤opencv图像处理⑤

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

 下面采用直接计算

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图像处理⑤

 重影,模糊

 

图像梯度—Scharr算子

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

opencv图像处理⑤ 

图像梯度—laplacian算子 

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

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

opencv图像处理⑤

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

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图像处理⑤

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

 

 

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
上一篇 2022年6月8日 上午11:49
下一篇 2022年6月8日 上午11:51

相关推荐

本站注重文章个人版权,不会主动收集付费或者带有商业版权的文章,如果出现侵权情况只可能是作者后期更改了版权声明,如果出现这种情况请主动联系我们,我们看到会在第一时间删除!本站专注于人工智能高质量优质文章收集,方便各位学者快速找到学习资源,本站收集的文章都会附上文章出处,如果不愿意分享到本平台,我们会第一时间删除!