欢迎来到第壹文秘! | 帮助中心 分享价值,成长自我!
第壹文秘
全部分类
  • 幼儿/小学教育>
  • 中学教育>
  • 高等教育>
  • 研究生考试>
  • 外语学习>
  • 资格/认证考试>
  • 论文>
  • IT计算机>
  • 法律/法学>
  • 建筑/环境>
  • 通信/电子>
  • 医学/心理学>
  • ImageVerifierCode 换一换
    首页 第壹文秘 > 资源分类 > DOCX文档下载
    分享到微信 分享到微博 分享到QQ空间

    (OpenCV+Python)六种算子 Sobel Scharr 拉普拉斯 Laplacian Roberts Prewitt.docx

    • 资源ID:751056       资源大小:209.50KB        全文页数:16页
    • 资源格式: DOCX        下载积分:5金币
    快捷下载 游客一键下载
    账号登录下载
    三方登录下载: 微信开放平台登录 QQ登录
    下载资源需要5金币
    邮箱/手机:
    温馨提示:
    快捷下载时,如果您不填写信息,系统将为您自动创建临时账号,适用于临时下载。
    如果您填写信息,用户名和密码都是您填写的【邮箱或者手机号】(系统自动生成),方便查询和重复下载。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP,免费下载
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    (OpenCV+Python)六种算子 Sobel Scharr 拉普拉斯 Laplacian Roberts Prewitt.docx

    我们在教程顶帽与黑帽操作中留了一个小彩蛋一一形态学的梯度问题,通常情况下,它被用于提取图像的轮廓。今天我们来了解图像边缘的另一种方法,它将比形态学梯度更有效,适用范围也更广。Sobel算子前面的例子,已经接触到了图像卷积运算。最重要的卷积运算之一是用于计算图像的导数(或近似导数)。为什么图像中导数的计算很重要,看下面边缘检测的例子:很容易观察到上面图像中像素灰度值变化没有规律。一种比较好的描述这种变化的方法是采用导数。其中梯度剧烈变化的地方代表图像灰度值变化强烈的地方,也就是边缘。为了更好的说明,以1维图像(也就是图像的1行)为例。边缘出现在灰度值跳变的地方,如下图所示:如果对上面的1维图像求导数,得到下图,可以很明显的看到边缘所在的位置。从上面的解释,我们可以设置一个阈值,根据局部像素变化强烈程度获取图像边缘。Sobel算子是一个离散微分算子,计算得到的是图像梯度的近似值。SobeI算子结合了高斯平滑和微分。假设输入图像是L,核大小为3,通过下面运算分别计算水平方向和垂直方向的微分:a.水平方向:b.垂直方向:-1-2-1'Gy=000*I.+1+2+1.具体运算为:Gx=(-1)f(×-ly-1)+0f(x,y-1)+7f(x+1,yT)+(-2)依-7M+(×,y)÷2*f(x÷1,y)Sf(x-1,y+1)+(fy+1)÷f(x+1,y÷1)=f(xLyT)+2行,行",y"""r"a(xT,y)+f(x1y+1)lGy=f(x-1,y-1)÷2加W7f(x÷1,y-1)7f(xT,y)+0*f(x÷1,y)+(-1)-f(x-1,y+1)+(-2)-f(x,y÷1)÷(-1)f(×÷1,y÷1)=(f(x-ly-l)+2f(x,y-1)+f(x÷1,y-1)-f(×-l,y+1)÷2*f(x,y+1)+f(x+l,y+1)结合上面结果可以计算出图像中一个点的近似梯度:G=yGl+Gl或者表示为:G=田+IGyl需要注意的是,当核的大小为3时,也就是上面所示的SObel核可能会产生明显的误差(毕竟Sobel只是微分的近似值)。在C)PenCV-PythOn中,使用Sobel的算子的函数原型如下:dst=cv2.Sobel(src,ddepth,dx,dy,dst,ksize,scale,delta,borderTypeJ)(1)前四个是必须的参数:第一个参数是需要处理的图像。第二个参数是图像的深度,-1表示采用的是与原图像相同的深度。目标图像的深度必须大于等于原图像的深度。dx和dy表示的是求导的阶数,0表示这个方向上没有求导,一般为0、1、2o(2)其后是可选的参数:dst不用解释了。ksize是SObel算子的大小,必须为1、3、5、7。scale是缩放导数的比例常数,默认情况下没有伸缩系数。delta是一个可选的增量,将会加到最终的dst中,同样,默认情况下没有额外的值加到dst中。bordefype是判断图像边界的模式。这个参数默认值为cv2.BORDER_DEFAULTo现在我们来看实验图像:实战代码:importcv2importnumpyasnpimg=cv2.imread(,'pie.png',0)x=cv2.Sobel(img,cv2.CV_l6S,1,0)cv2.imshow("x',x)cv2.waitKey(0)cv2.destroyAIlWindows()我们发现没有输出,原因在于图像格式的问题,在SObel函数的第二个参数这里使用了cv2.CV_16So因为OPenCV文档中对Sobel算子的介绍中有这么一句:“inthecaseof8-bitinputimagesitwillresultintruncatedderivatives,oBRSobel函数求完导数后会有负值,还有会大于255的值。而原图像是uint8,即8位无符号数,所以SObel建立的图像位数不够,会有截断。因此要使用16位有符号的数据类型,即cv2.CV6S。在经过处理后,别忘了用ConVertSCaIeAbSO函数将其转回原来的Uint8形式。否则将无法显示图像,而只是一副灰色的窗口。COnVertSCaIeAbS()的原型为:dst=cv2.convertScaleAbs(src,dst,alpha,beta)其中可选参数alpha是伸缩系数,beta是加到结果上的一个值。结果返回uint8类型的图片。由于Sobel算子是在两个方向计算的,最后还需要用cv2.addWeighted。.)函数将其组合起来。其函数原型为:dst=cv2.addWeighted(src1,alpha,src2,beta,gamma,dst,dtypeJ)当然,这个函数我们在前面已经讲述过在这里就不多讲述了。我们再来看代码:importcv2importnumpyasnpimg=cv2.imread(,'pie.png',0)x=cv2.Sobel(img,cv2.CV_16S,1,0)y=cv2.Sobel(img,cv2.CV_16S,0,1)absX=cv2.convertScaleAbs(x)absY=cv2.convertScaleAbs(y)dst=cv2.addWeighted(absX,0.5,absY,0.5,0)cv2.imshow("x",absX)cv2.imshow(',y",absY)cv2.imshow(,'res",dst)cv2.waitKey(0)cv2.destroyAllWindows()先分别来看下,x,y两个方向上的:再看看最终相加在一起的:由于Sobel算子是滤波算子的形式,用于提取边缘,可以利用快速卷积函数,简单有效,因此应用广泛。美中不足的是,Sobel算子并没有将图像的主体与背景严格地区分开来,即SobeI算子没有严格地模拟人的视觉生理特征,所以提取的图像轮廓有时并不能令人满意。Scharr算子ScharrO函数提供了比标准SObeI函数更精确的计算结果。它使用了下面的核:-3O+3-3-10-3GX=-10O+10和Gy=OOO-3O+3.,+3+10+3除了卷积核与SobeI不同,在其余方面它与SObel基本一致,我们来看它的函数原型:dst=cv2.Scharr(src,ddepth,dx,dy,dst,ksize,scale,delta,borderTypel)参数就不再介绍了,与SObel是完全一致的,我们来看看代码演示:importcv2importnumpyasnpimg=cv2.imread(pie.png,0)x=cv2.Scharr(img,cv2.CV_16S,1,0)y=cv2.Scharr(img,cv2.CV_16S,0,1)absX=cv2.convertScaleAbs(x)absY=cv2.convertScaleAbs(y)dst=cv2.addWeighted(absX,0.5,absY,0.5,0)cv2.imshow(',res,',dst)cv2.waitKey(0)cv2.destroyAHWindows()本次教程所讲述的Sobel算子与Scharr算子在图形的边缘检测方面有些缺陷,想必大家也看到了,不过在下面我们将会讲述这个问题。拉普拉斯算子我们在上面教程中的例子学习了使用Sobel边缘检测。原理是利用边缘区域像素值的跳变。通过求一阶导数,可以使边缘值最大化。如下图所示:那么,如果求二阶导数会得到什么呢?可以观察到二阶导数为O的地方。因此,可以利用该方法获取图像中的边缘。然而,需要注意的是二级导数为O的不只出现在边缘地方,还可能是一些无意义的位置,根据需要通过滤波处理该情况。二阶微分现在我们来讨论二阶微分,它是拉普拉斯算子的基础,与微积分中定义的微分略有不同,数字图像中处理的是离散的值,因此对于一维函数的一阶微分的基本定义是差值:察=胆+1)-加C/Jb类似的,二阶微分定义为:=(x+l)+(rr-l)-2(x)将一维函数扩展到二维:废=胆+1,y)+f(Ll,y)-2f(x,y)2f二阶微分的定义保证了以下几点:在恒定灰度区域的微分值为零。在灰度台阶或斜坡的起点处微分值非零。可以看出,二阶微分可以检测出图像的边缘、增强细节。拉普拉斯算子从上面的解释,可以看出二阶导数可以拥有边缘检测。由于图像是二维的,因此需要分别获取两个方向的导数。这里使用的是拉普拉斯算子来进行近似。拉普拉斯算子用下面公式定义:,、92f2f1.aplace(f=-÷其中:E=/x+L川-2x,>+x-LyOXTTT=/xJ+1-2用+-16y可以用多种方式将其表示为数字形式。对于一个3*3的区域,一般情况下被推荐最多的形式是:V2/=÷4=(z+Ly)+('-i,y)+/(&y+i)+/(£*-1)一V(y)实现上式的滤波器模板为:O10'1-41010_我们可以发现,拉普拉斯算子不需要向Sobel算子那样分别对X,y方向进行处理,它可以直接处理,现在我们来看看OPenCV中的拉普拉斯算子的函数原型:dst=cv2.Laplacian(src,ddepth,dst,ksize,scale,delta,borderType)(1)前两个是必须的参数:第一个参数是需要处理的图像。第二个参数是图像的深度,-1表示采用的是与原图像相同的深度。目标图像的深度必须大于等于原图像的深度。(2)其后是可选的参数:dst不用解释了。ksize是算子的大小,必须为1、3、5、7o默认为1。SCale是缩放导数的比例常数,默认情况下没有伸缩系数。delta是一个可选的增量,将会加到最终的dst中,同样,默认情况下没有额外的值加到dst中。borderType是判断图像边界的模式。这个参数默认值为cv2.BORDER_DEFAULTo我们来看代码:importcv2importnumpyasnpimg=cv2.imread(,'pie.png',)dst=cv2.Laplacian(img,cv2.CV_16S,ksize=3)dst=cv2.convertScaleAbs(dst)cv2.imshow(uimg,img)cv2.imshow(nres",dst)cv2.waitKey(0)cv2.destroyAllWindows()现在可以拿这个结果对比上一个教程的结果了,我们发现,这个结果要比上一个教程的结果好的多,对于边缘检测没有大的偏差。然而事实上,这只是对于简单的图像而言,而对于一幅复杂的图像,那么边缘提取就有点爱莫能助了,我们来看代码:importcv2importnumpyasnpimg=cv2.imread("cat.jpg,')dst=cv2.Laplacian(img,cv2.CV_16S,ksize=3)dst=cv2.convertScaleAbs(dst)cv2.imshow(uimg,img)cv2.imshow(',res",dst)cv2.waitKey(0)cv2.destroyA

    注意事项

    本文((OpenCV+Python)六种算子 Sobel Scharr 拉普拉斯 Laplacian Roberts Prewitt.docx)为本站会员(p**)主动上传,第壹文秘仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知第壹文秘(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

    copyright@ 2008-2023 1wenmi网站版权所有

    经营许可证编号:宁ICP备2022001189号-1

    本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。第壹文秘仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知第壹文秘网,我们立即给予删除!

    收起
    展开