opencv 图片边缘渐变_python+opencv图像处理(四十)

Sobel算子 

开头来张帅哥......

4cc20d55c13b321ec938324637ceda84.png

----------------------这是严谨的分割线--------------------------

1、Sobel算子(索贝尔算子) Sobel算子是一种用于边缘检测的离散微分算子, 主要用于获得数字图像的一阶梯度。 该算子用于计算图像明暗程度近似值,根据图像边缘旁边明暗程度把该区域内超过某个数的特定点记为边缘。 Sobel算子在Prewitt算子的基础上增加了权重的概念,认为相邻点的距离远近对当前像素点的影响是不同的,距离越近的像素点对应当前像素的影响越大,从而实现图像锐化并突出边缘轮廓。 Sobel算子的边缘定位更准确,常用于噪声较多、灰度渐变的图像。 Sobel算子如下:

2ea0bf52ef961943cbf76a624eace4c3.png

2、sobel函数实现 Sobel算子在opencv中自带了函数实现,函数参数含义如下: dst = Sobel(src, ddepth, dx, dy[, dst[, ksize[, scale[, delta[, borderType]]]]]) 其中,前四个是必须的参数: src 表示输入图像; ddepth 表示目标图像所需的深度,针对不同的输入图像,输出目标图像有不同的深度,-1表示与原图像相同的深度; dx 和dy表示的是求导的阶数,0表示不求导,一般为0、1、2。 如下图所示,左图为原图,右图是用Sobel算子检测出的边缘。

6790ec272dd3db46d47a1b0fc742d0fc.png

其完整代码如下:

import cv2 as cv

def sobel(img):

   x=cv.Sobel(src,cv.CV_16S,1,0)

    y=cv.Sobel(src,cv.CV_16S,0,1)

    gradx=cv.convertScaleAbs(x)

    cv.imshow("x",gradx)

    grady=cv.convertScaleAbs(y)

    cv.imshow("y",grady)

    res=cv.addWeighted(gradx,0.5,grady,0.5,0)

    return res

src=cv.imread("E:/image/lena.jpg")

cv.imshow("origin",src)

res=sobel(src)

cv.imshow("sobel",res)

后两张图是展示的 x和y方向上的梯度。

21c13f8e1d3d76f182510b91a748a8e6.png

在本例中, Sobel函数的第二个参数这里使用的是cv.CV_16S,原因是Sobel函数求完导数后会有大于255的数或者会有负数,而原图像是unit8的,所以改成了16位有符号的数据类型,即cv.CV_16S。 经过处理后,要将16位的有符号数转换为unit8,所以在代码中会有后面几行。 3、其余参数 除以上 4个参数外, 其余参数为可选参数: ksize 表示Sobel算子的大小,其值必须是正数和奇数,1,3,5,7; scale 表示缩放导数的比例常数,默认情况下没有伸缩系数; delta 表示将结果存入目标图像之前,添加到结果中的可选增量值; borderType 表示边框模式。 有兴趣的朋友自己去实验吧6f34b79336b8e39ffc431aa0f34c08d6.png6f34b79336b8e39ffc431aa0f34c08d6.png6f34b79336b8e39ffc431aa0f34c08d6.png
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值