第4讲 图像梯度(sobel,scharr,laplacian)

一般来讲,只有色彩变化较大的地方才会产生,也就是说,只有在边缘。

图像sobel算子
在这里插入图片描述
在这里插入图片描述
这个是水平方向的梯度,右边减去左边
同样,下边减去上边。是竖直方向

在这里插入图片描述
原始图像
在这里插入图片描述

现在采用sobel算子,水平方向右边减去左边。
如下所示:
在这里插入图片描述
可以看到只有左边的,因为我们采用的是右边减去左边,其中中间的为白色,减去左边的黑丝就是 >0,因此会保留,而右边减去左边,是黑色减去中间,就成了黑丝减去白色<0所以会不显示。
在这里插入图片描述
在这里插入图片描述
也就是只有一半
如果想把右边的一半也显示,怎么办了?当然可以考虑将负数编程整数麻,试试看。
sobelx = cv2.convertScaleAbs(sobelx)
cv_show(‘sobelx’,sobelx)
经过测试发现,果然好使

sobelx = cv2.convertScaleAbs(sobelx)
cv_show('sobelx',sobelx)
# 经过测试发现,果然好使

在这里插入图片描述
我们发现,的确在左边和右边已经出现了圆的轮廓雏形。
在这里插入图片描述

sobelx = cv2.convertScaleAbs(sobelx)
cv_show('sobelx',sobelx)
# 经过测试发现,果然好使
sobely = cv2.Sobel(img,cv2.CV_64F,0,1,ksize=3)  
cv_show('sobely',sobely)

在这里插入图片描述

#分别计算x和y,在求和,这样会不会弥补单独求时的不足了?
sobelxy = cv2.addWeighted(sobelx,0.5,sobely,0.5,0)
cv_show("sobelxy",sobelxy)

在这里插入图片描述
如上图可以看出来,效果并不好,因此建议分开处理,再加和。

import cv2
import numpy as np
lena = cv2.imread("lena.jpg")

lena=cv2.cvtColor(lena,cv2.COLOR_BGR2GRAY)
lena = cv2.medianBlur(lena,5)

def cv_show(name,img):
    cv2.imshow(name,img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
cv_show("lena",lena) # 显示一下原图

在这里插入图片描述
在这里插入图片描述
整体计算,全部设置为1如下

# 整体设置为1,一起进行计算
sobelxy = cv2.Sobel(lena,cv2.CV_64F,1,1,ksize=3)
sobelxy = cv2.convertScaleAbs(sobelxy)
sobelxy1 = cv2.addWeighted(sobelx,0.5,sobely,0.5,0)
cv_show("sobelxy1",sobelxy1)
sobelxy_show = np.hstack((sobelxy,sobelxy1))
cv_show("sobelxy_show",sobelxy_show)

在这里插入图片描述由此可知分开计算效果好一些,而单独计算会有重影
——————————————————————————————————————————————
在这里插入图片描述
在这里插入图片描述
拉普拉斯二阶导

soble ,
scharrx,
laplacian
对比
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

import cv2
import numpy as np
lena = cv2.imread("lena.jpg")

# 中值滤波去除椒盐噪声
lena = cv2.medianBlur(lena,5)
# 灰度化处理,看的更清楚
lena=cv2.cvtColor(lena,cv2.COLOR_BGR2GRAY)

# sobel算法处理
sobelx = cv2.Sobel(lena,cv2.CV_64F,1,0,ksize=3)
sobelx = cv2.convertScaleAbs(sobelx)
sobely = cv2.Sobel(lena,cv2.CV_64F,1,0,ksize=3)
sobely = cv2.convertScaleAbs(sobely)
sobelxy = cv2.addWeighted(sobelx,0.5,sobely,0.5,0)
cv_show("sobelxy",sobelxy)

# scharr算法处理
scharrx = cv2.Scharr(lena,cv2.CV_64F,1,0)
scharrx = cv2.convertScaleAbs(sobelx)
scharry = cv2.Scharr(lena,cv2.CV_64F,1,0)
scharry = cv2.convertScaleAbs(sobely)
scharrxy = cv2.addWeighted(scharrx,0.5,scharry,0.5,0)
cv_show("scharrxy",scharrxy)

# laplacian算法处理
laplacian = cv2.Laplacian(lena,cv2.CV_64F)
laplacian = cv2.convertScaleAbs(laplacian)
cv_show("laplacian",laplacian)
import numpy as np
sum_show = np.hstack((lena,sobelxy,scharrxy,laplacian))
cv_show("sum_show",sum_show)

(完)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值