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

上传人:lao****ou 文档编号:1249075 上传时间:2025-04-15 格式:DOCX 页数:17 大小:186.71KB
下载 相关 举报
(OpenCV+Python)六种算子 Sobel Scharr 拉普拉斯 Laplacian Roberts Prewitt.docx_第1页
第1页 / 共17页
(OpenCV+Python)六种算子 Sobel Scharr 拉普拉斯 Laplacian Roberts Prewitt.docx_第2页
第2页 / 共17页
(OpenCV+Python)六种算子 Sobel Scharr 拉普拉斯 Laplacian Roberts Prewitt.docx_第3页
第3页 / 共17页
(OpenCV+Python)六种算子 Sobel Scharr 拉普拉斯 Laplacian Roberts Prewitt.docx_第4页
第4页 / 共17页
(OpenCV+Python)六种算子 Sobel Scharr 拉普拉斯 Laplacian Roberts Prewitt.docx_第5页
第5页 / 共17页
亲,该文档总共17页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《(OpenCV+Python)六种算子 Sobel Scharr 拉普拉斯 Laplacian Roberts Prewitt.docx》由会员分享,可在线阅读,更多相关《(OpenCV+Python)六种算子 Sobel Scharr 拉普拉斯 Laplacian Roberts Prewitt.docx(17页珍藏版)》请在第一文库网上搜索。

1、我们在教程顶帽与黑帽操作中留了一个小彩蛋一一形态学的梯度问题, 通常情况下,它被用于提取图像的轮廓。今天我们来了解图像边缘的另一种方法, 它将比形态学梯度更有效,适用范围也更广。Sobel算子前面的例子,已经接触到了图像卷积运算。最重要的卷积运算之一是用于计 算图像的导数(或近似导数)。为什么图像中导数的计算很重要,看下面边缘检 测的例子:很容易观察到上面图像中像素灰度值变化没有规律。一种比较好的描述这种 变化的方法是采用导数。其中梯度剧烈变化的地方代表图像灰度值变化强烈的地 方,也就是边缘。为了更好的说明,以1维图像(也就是图像的1行)为例。边缘出现在灰度 值跳变的地方,如下图所示:如果对上

2、面的1维图像求导数,得到下图,可以很明显的看到边缘所在的位So从上面的解释,我们可以设置一个阈值,根据局部像素变化强烈程度获取图 像边缘。Sobel算子是一个离散微分算子,计算得到的是图像梯度的近似值。Sobel算 子结合了高斯平滑和微分。假设输入图像是L ,核大小为3,通过下面运算分别计算水平方向和垂直方 向的微分:a.水平方向:0 +10 +2 * I0 +1一10+1b.垂直方向:-2 -100+2 +1具体运算为:Gx = (-1)f(-l y-1) Of(Xyl) + 开(x+1,y-1)-gf(x-1,y) + (,y)2*f(x+1,y)+Z)f(x-7yT) + (x,y1)

3、1*f(x+1,y1): Ex+LyT)+2 欣+7M欣 刀六沙修ya(x-1,y)+f(x-Ly+1)Gy =1* f(-1f y1) + 2f(xty1)+ 开(x+LyT)0x- 1ty) (x,y) + 0*f(1,y)+(-1)*f(x-1,yl) (-2)*f(x,y1) + (-1)*f( y1)=If(X-LyT) 2f(x,y- + f(yl)(f(-l, yl) 2*f(x,y1)+f(x+1,y*1)结合上面结果可以计算出图像中一个点的近似梯度:G = yJ Gl + Gl或者表示为:G=G, + Gy需要注意的是,当核的大小为3时,也就是上面所示的SObeI核可能会产生

4、 明显的误差(毕竟Sobel只是微分的近似值)。在OPenCV-PythOn中,使用Sobel的算子的函数原型如下:dst = cv2.Sobel(src, ddepth, dx, dy, dst, ksize, scale, delta, borderType)(1)前四个是必须的参数:第一个参数是需要处理的图像。第二个参数是图像的深度,-1表示采用的是与原图像相同的深度。目标图像 的深度必须大于等于原图像的深度。dx和dy表示的是求导的阶数,0表示这个方向上没有求导,一般为0、1、 2o(2)其后是可选的参数:dst不用解释了。ksize是SObel算子的大小,必须为1、3、5、7。sca

5、le是缩放导数的比例常数,默认情况下没有伸缩系数。delta是一个可选的增量,将会加到最终的dst中,同样,默认情况下没有额 外的值力口至Idst中。bordefype是判断图像边界的模式。这个参数默认值为cv2.BORDER_DEFAULT。现在我们来看实验图像:实战代码:import cv2import numpy as npimg = cv2.imread(pie.png,0)x=cv2.Sobel(img,cv2.CV_16S,l,0)cv2.imshow(x,x)cv2.waitKey(0)cv2.destroyAl lWindows()我们发现没有输出,原因在于图像格式的问题,在S

6、ObeI函数的第二个参数 这里使用了 cv2.CV_16So因为OPenCV文档中对Sobel算子的介绍中有这么一 句:“in the case of 8-bit input images it will result in truncated derivativesBP Sobel 函数求完导数后会有负值,还有会大于255的值。而原图像是Uint8,即8位无 符号数,所以SObeI建立的图像位数不够,会有截断。因此要使用16位有符号 的数据类型,即cv2.CV6S。在经过处理后,别忘了用COnVertSCaleAbS()函数将其转U原来的Uint8形式。 否则将无法显示图像,而只是一副灰色的

7、窗口。COnVertSCaIeAbS()的原型为:dst = cv2.convertScaleAbs(src, dst, alpha, beta)其中可选参数alpha是伸缩系数,beta是加到结果上的一个值。结果返回Uint8 类型的图片。由于Sobel算子是在两个方向计算的,最后还需要用CV2.addWeighted(.)函 数将其组合起来。其函数原型为:dst = cv2.addWeighted(src 1, alpha, src2, beta, gamma, dst, dtype) 当然,这个函数我们在前面已经讲述过在这里就不多讲述了。 我们再来看代码:import cv2import

8、 numpy as npimg = cv2.imread(pie.png,0)x=cv2.Sobel(img,cv2.CV_16S,l,0)y = cv2.Sobel(img,cv2.CV_16S,0,l)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,ab s Y)cv2.imshow(nresn,dst)cv2.waitKey(0)cv2.destroy AllWindowsO先分别来看下

9、,, y两个方向上的:再看看最终相加在一起的:由于SobeI算子是滤波算子的形式,用于提取边缘,可以利用快速卷积函数, 简单有效,因此应用广泛。美中不足的是,Sobel算子并没有将图像的主体与背 景严格地区分开来,即SObeI算子没有严格地模拟人的视觉生理特征,所以提取 的图像轮廓有时并不能令人满意。Scharr算子ScharrQ函数提供了比标准SobeI函数更精确的计算结果。它使用了下面的 核:-30+3 一3-10一3100+10和Gy =000-30+3.-+3+10+3除了卷积核与SobeI不同,在其余方面它与Sobel基本一致,我们来看它的 函数原型:dst = cv2.Scharr

10、(src, ddepth, dx, dy, dst, ksize, scale, delta, borderType)参数就不再介绍了,与SobeI是完全一致的,我们来看看代码演示:import cv2import numpy as npimg = cv2.imread(npie.png,0)x =cv2.Scharr(img,cv2.CV_16S,l,0)y = cv2.Scharr(img,cv2.CV_16S,0,l)absX =cv2.convertScaleAbs(x)absY = cv2.convertScaleAbs(y)dst =cv2.addWeighted(absX,0.5

11、,absY,0.5,0)cv2.imshow(resn,dst)cv2.waitKey(0)cv2. destroy AllWindowsO本次教程所讲述的Sobel算子与Scharr算子在图形的边缘检测方面有些缺 陷,想必大家也看到了,不过在下面我们将会讲述这个问题。拉普拉斯算子我们在上面教程中的例子学习了使用Sobel边缘检测。原理是利用边缘区域 像素值的跳变。通过求一阶导数,可以使边缘值最大化。如下图所示:那么,如果求二阶导数会得到什么呢?可以观察到二阶导数为O的地方。因此,可以利用该方法获取图像中的边缘。 然而,需要注意的是二级导数为。的不只出现在边缘地方,还可能是一些无意义 的位置,

12、根据需要通过滤波处理该情况。二阶微分现在我们来讨论二阶微分,它是拉普拉斯算子的基础,与微积分中定义的微 分略有不同,数字图像中处理的是离散的值,因此对于一维函数的一阶微分的基 本定义是差值:瓦=(+ 1) - f(x)类似的,二阶微分定义为:-=x+l)+(x-l)-2()Cfxr将一维函数扩展到二维:f腑=(n+L y) + f(x-1,1/)- 2f(x, y)2f-9 = /(四 3/ + 1)+ /( Z/- 1) - 2/(四 y)二阶微分的定义保证了以下几点:在恒定灰度区域的微分值为零。在灰度台阶或斜坡的起点处微分值非零。可以看出,二阶微分可以检测出图像的边缘、增强细节。拉普拉斯算

13、子从上面的解释,可以看出二阶导数可以拥有边缘检测。由于图像是二维的, 因此需要分别获取两个方向的导数。这里使用的是拉普拉斯算子来进行近似。拉普拉斯算子用下面公式定义:Laplace(f)=2f 上 2fx2+ 2其中:=xl, j-2x, jx-lOXO=/,y+1 - 2/占用+/x j -1oy可以用多种方式将其表示为数字形式。对于一个3*3的区域,一般情况下被 推荐最多的形式是:V2/=痣 + . = /(I+1 y) + f(x- l,y) + f(x,y+1) + f(x,y - 1) - 4f(x, y)实现上式的滤波器模板为:O 101 一 4 1010我们可以发现,拉普拉斯算子

14、不需要向SobeI算子那样分别对X, y方向进 行处理,它可以直接处理,现在我们来看看OPenCV中的拉普拉斯算子的函数原 型:dst = cv2.Laplacian(src, ddepth, dst, ksize, scale, delta, borderType)(1)前两个是必须的参数:第一个参数是需要处理的图像。第二个参数是图像的深度,-1表示采用的是与原图像相同的深度。目标图像 的深度必须大于等于原图像的深度。(2)其后是可选的参数:dst不用解释了。ksize是算子的大小,必须为1、3、5、7。默认为1。scale是缩放导数的比例常数,默认情况下没有伸缩系数。delta是一个可选的增量,将会加到最终的dst中,同样,默认情况下没有额 外的值加到dst中。bordeype是判断图像边界的模式。这个参数默认值为cv2.BORDER_DEFAULT o我们来看代码:import cv2import numpy as npimg = cv2.imread(pie.png)dst =cv2.Laplacian(img,cv2.CV_16S,ksize=3)dst =cv2.convertScaleAbs(dst)cv2.imshow(imgn,img)cv2.imshow(,res,dst)cv2.waitKey(0)cv2.destroy AllWindows()

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 应用文档 > 工作总结

copyright@ 2008-2022 001doc.com网站版权所有   

经营许可证编号:宁ICP备2022001085号

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



客服