关于opencv的学习(二)

接下来继续对opencv进行学习,学习图像梯度,Canny边缘检测和图像金字塔三部分内容

图像梯度

sobel算子:

#右-左,上-下
# dst = cv2.Sobel(scr,ddepth,dx,dy,ksize)
#ddepth:图像的深度   通常是-1
#dx,dy分别表示水平和竖直方向
#ksize是Soble算子的大小    一般3*3

 以上是对Sobel算子用法总体说明。

接下来是一些具体的应用:

cat = cv2.imread('cat.jpg',cv2.IMREAD_GRAYSCALE)
soblex = cv2.Sobel(cat,cv2.CV_64F,1,0,ksize=3)
cv_show('a',soblex)
sobley =cv2.Sobel(cat,cv2.CV_64F,0,1,ksize=3)
cv_show('b',sobley)

 左边是soblex,右边是sobley。

负数会被截断,取绝对值会使轮廓更清楚

#白到黑是正数,黑到白是负数,负数会被0截断,所以要取绝对值
soblex = cv2.Sobel(cat,cv2.CV_64F,1,0,ksize=3)
soblex =cv2.convertScaleAbs(soblex)
cv_show('c',soblex)

sobley =cv2.Sobel(cat,cv2.CV_64F,0,1,ksize=3)
sobley =cv2.convertScaleAbs(sobley)
cv_show('b',sobley)

其中convertScaleAbs是对对象取绝对值。

 

  左边是soblex,右边是sobley。

 下面是基于上述操作求和和直接求和的对比:

#分别计算x和y,再求和
soblexy=cv2.addWeighted(soblex,0.5,sobley,0.5,0)
cv_show('e',soblexy)

#直接计算:
soblexy =cv2.Sobel(cat,cv2.CV_64F,1,1,ksize=3)
soblexy =cv2.convertScaleAbs(soblexy)
cv_show('g',soblexy)
#效果可能不太好

左图是先计算x,y再求和,右边是直接求和。

 scharr与laplacian算子:

scharr对结果的差异更敏感
laplacian对噪点敏感

#线条更多
img=cv2.imread('cat.jpg',cv2.IMREAD_GRAYSCALE)
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((soblexy,scharrxy,laplacian))
cv_show('v',res)

 只是三个的对比图(其中soble是直接求和)

Canny边缘检测:

使用高斯滤波,滤除噪声
计算像素点的梯度和方向 (soble)
非极大值抑制
双阈值检测

通常情况下边缘检测的目的是在保留原有图像属性的情况下,显著减少图像的数据规模。

img = cv2.imread('cat.jpg',cv2.IMREAD_GRAYSCALE)
v1=cv2.Canny(img,80,150)    #80minVal  150maxVal
v2=cv2.Canny(img,50,100)    #越小要求越高,边缘信息越多

res = np.hstack((v1,v2))
cv_show('res',res)

 对比图,对于双阈值的选择,越小线条越多,边缘信息越多。

图像金字塔:

高斯金字塔

把图像放大或者缩小

先卷积后池化
print(img.shape)

up=cv2.pyrUp(img)
cv_show('up',up)
print(up.shape)

down = cv2.pyrDown(img)
cv_show('down',down)
print(down.shape)

原本的(296, 474)
放大的(592, 948)
缩小的(148, 237)

结果是不可逆转的,先上采样,再下采样,结果与原来的不一样,会丢失一部分信息

(了解)拉普拉斯金字塔:

down = cv2.pyrDown(img)
down_up =cv2.pyrUp(down)
l_l=img-down_up
cv_show('l_l',l_l)

 

 (cv_show是自己写好的函数)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值