(OpenCV+Python)六种算子 Sobel Scharr 拉普拉斯 Laplacian Roberts Prewitt.docx
《(OpenCV+Python)六种算子 Sobel Scharr 拉普拉斯 Laplacian Roberts Prewitt.docx》由会员分享,可在线阅读,更多相关《(OpenCV+Python)六种算子 Sobel Scharr 拉普拉斯 Laplacian Roberts Prewitt.docx(16页珍藏版)》请在第壹文秘上搜索。
1、我们在教程顶帽与黑帽操作中留了一个小彩蛋一一形态学的梯度问题,通常情况下,它被用于提取图像的轮廓。今天我们来了解图像边缘的另一种方法,它将比形态学梯度更有效,适用范围也更广。Sobel算子前面的例子,已经接触到了图像卷积运算。最重要的卷积运算之一是用于计算图像的导数(或近似导数)。为什么图像中导数的计算很重要,看下面边缘检测的例子:很容易观察到上面图像中像素灰度值变化没有规律。一种比较好的描述这种变化的方法是采用导数。其中梯度剧烈变化的地方代表图像灰度值变化强烈的地方,也就是边缘。为了更好的说明,以1维图像(也就是图像的1行)为例。边缘出现在灰度值跳变的地方,如下图所示:如果对上面的1维图像求
2、导数,得到下图,可以很明显的看到边缘所在的位置。从上面的解释,我们可以设置一个阈值,根据局部像素变化强烈程度获取图像边缘。Sobel算子是一个离散微分算子,计算得到的是图像梯度的近似值。SobeI算子结合了高斯平滑和微分。假设输入图像是L,核大小为3,通过下面运算分别计算水平方向和垂直方向的微分:a.水平方向:b.垂直方向:-1-2-1Gy=000*I.+1+2+1.具体运算为:Gx=(-1)f(-ly-1)+0f(x,y-1)+7f(x+1,yT)+(-2)依-7M+(,y)2*f(x1,y)Sf(x-1,y+1)+(fy+1)f(x+1,y1)=f(xLyT)+2行,行,yra(xT,y)
3、+f(x1y+1)lGy=f(x-1,y-1)2加W7f(x1,y-1)7f(xT,y)+0*f(x1,y)+(-1)-f(x-1,y+1)+(-2)-f(x,y1)(-1)f(1,y1)=(f(x-ly-l)+2f(x,y-1)+f(x1,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=cv
4、2.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中。bor
5、defype是判断图像边界的模式。这个参数默认值为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-bitinputimage
6、sitwillresultintruncatedderivatives,oBRSobel函数求完导数后会有负值,还有会大于255的值。而原图像是uint8,即8位无符号数,所以SObel建立的图像位数不够,会有截断。因此要使用16位有符号的数据类型,即cv2.CV6S。在经过处理后,别忘了用ConVertSCaIeAbSO函数将其转回原来的Uint8形式。否则将无法显示图像,而只是一副灰色的窗口。COnVertSCaIeAbS()的原型为:dst=cv2.convertScaleAbs(src,dst,alpha,beta)其中可选参数alpha是伸缩系数,beta是加到结果上的一个值。结果返
7、回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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- OpenCV+Python六种算子 Sobel Scharr 拉普拉斯 Laplacian Roberts Prewitt OpenCV Python 算子

链接地址:https://www.1wenmi.com/doc/751056.html