图像梯度-Sobel算子

  • 形态学梯度:膨胀减去腐蚀
  • 图像梯度:指边缘处产生的,常指二值图像中的黑白处。

dst = cv2.Sobel(src, ddepth, dx, dy, ksize)-----------白减去黑,或者黑减去白

  • ddepth:图像的深度,一般会写CV_64F,可以出现负数
  • dx和dy分别表示水平和竖直方向,水平:1,0(右边减左边);竖直:0,1(下面减上面);
  • ksize是Sobel算子的大小

两个方向的sobel算子如下所示,我们采用模板对原图像进行卷积运算,即某处的像素的8邻域的9个像素值分别与sobel算子进行相乘再加和得到该处的像素值,通过观察可知,Gx就是该像素右边的三个相邻像素减去左边的三个相邻像素,Gy就是上面的三个相邻像素减去下面的三个相邻像素。为什么有的是2,有的是1呢?这是因为sobel算子将与目标像素距离近的相邻像素(横着竖着方向)权值设为2,距离远的(斜着的对角线)设置为1,认为距离远的影响小,距离近的影响大。

 



原图:

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

白到黑是正数,黑到白就是负数了,所有的负数opencv默认会被截断成0,所以要取绝对值

(若不取绝对值,那么黑到白会是负数,opencv默认处理为0,图像此处边缘就无法显示。只显示一边的边缘,如上图)

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)  -------------取绝对值

分别计算x和y,再求和

sobelxy = cv2.addWeighted(sobelx,0.5,sobely,0.5,0)

不建议直接计算,如果像下面直接计算(直接写1,1),产生的梯度会不太连续,不如分开再加和效果好。(如下图)

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

完整代码:

import cv2
import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline

def cv_imshow(name,img):
    cv2.imshow(name,img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
#分开计算再相加
img =cv2.imread('F://from 2to7 notebook//images//lena.jpg')
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_imshow('sobelxy',sobelxy)
#直接计算水平与竖直方向
sobelxy1=cv2.Sobel(img,cv2.CV_64F,1,1,ksize=3)
sobelxy1=cv2.convertScaleAbs(sobelxy1)
cv_imshow('sobelxy1',sobelxy1)

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值