sobel算子及cvsobel

sobel算子及cvsobel

ID:10861282

大小:59.50 KB

页数:5页

时间:2018-07-08

sobel算子及cvsobel_第1页
sobel算子及cvsobel_第2页
sobel算子及cvsobel_第3页
sobel算子及cvsobel_第4页
sobel算子及cvsobel_第5页
资源描述:

《sobel算子及cvsobel》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、Sobel算子及cvSobel(2010-11-2823:16:15)转载标签:opencvsobel算子cvsobel分类:OpenCV   由于项目里要用到边缘检测,所以今天研究了一下最简单的梯度的方法。   首先,我们来开一下计算机是如何检测边缘的。以灰度图像为例,它的理论基础是这样的,如果出现一个边缘,那么图像的灰度就会有一定的变化,为了方便假设由黑渐变为白代表一个边界,那么对其灰度分析,在边缘的灰度函数就是一个一次函数y=kx,对其求一阶导数就是其斜率k,就是说边缘的一阶导数是一个常数,而由于非边缘的一阶导数为零,这样通过求一阶导数就能初步判断

2、图像的边缘了。通常是X方向和Y方向的导数,也就是梯度。理论上计算机就是通过这种方式来获得图像的边缘。   但是,具体应用到图像中你会发现这个导数是求不了的,因为没一个准确的函数让你去求导,而且计算机在求解析解要比求数值解麻烦得多,所以就想到了一种替代的方式来求导数。就是用一个3×3的窗口来对图像进行近似求导。拿对X方向求导为例,某一点的导数为第三行的元素之和减去第一行元素之和,这样就求得了某一点的近似导数。其实也很好理解为什么它就近似代表导数,导数就代表一个变化率,从第一行变为第三行,灰度值相减,当然就是一个变化率了。这就是所谓的Prewitt算子。这样

3、近似X方向导数就求出来了。Y方向导数与X方向导数求法相似,只不过是用第三列元素之和减去第一列元素之和。X方向和Y方向导数有了,那么梯度也就出来了。这样就可以找出一幅图中的边缘了。   还有一个问题,由于求的是3×3中心点的导数,所以给第二列加了一个权重,它的权重为2,第一列和第三列的权重为1,好了,这就是Sobel算子了。相比Prewitt算子,Sobel的抗噪能力更强。如图所示:这样,中心点的X方向导数就求出来了。   举个例子吧。,X点以Sobel方式求导数ΔX=1×50+2×30+1×50-(1×50+2×30+1×50)=0。这样可以看出这个点不

4、是边界。   好了,了解了基本理论之后,我们看看OpenCv下的Sobel函数吧,voidcvSobel(constCvArr*src,CvArr*dst,intxorder,intyorder,intaperture_size=3);src:输入图像;dst:输出图像;xorder:x方向上的差分阶数;yorder:y方向上的差分阶数;aperture_size扩展Sobel核的大小(既窗口阶数),必须是1(注意这是一个3×1或1×3向量而不是一个方阵),3,5或7。   下面编写一个Sobel边缘检测的程序吧,平台是VS08,建立Win32控制台应用

5、程序。#include#includevoidmain(){IplImage*frame,*gray,*sobel;frame=cvLoadImage("lena.jpg");//加载图像gray=cvCreateImage(cvGetSize(frame),frame->depth,1);//分配图像空间sobel=cvCreateImage(cvGetSize(frame),frame->depth,1);cvNamedWindow("frame");cvNamedWindow("gray");cvNamedWind

6、ow("sobel");cvCvtColor(frame,gray,CV_BGR2GRAY);//转为灰度cvSobel(gray,sobel,1,0,3);cvShowImage("frame",frame);//显示图像cvShowImage("gray",gray);cvShowImage("sobel",sobel);cvWaitKey(0);//等待cvReleaseImage(&frame);//释放空间(对视频处理很重要,不释放会造成内存泄露)cvReleaseImage(&gray);cvReleaseImage(&sobel);cvDe

7、stroyWindow("frame");cvDestroyWindow("gray");cvDestroyWindow("sobel");}运行,你会发现出错,仔细看看没有问题啊。其实,这里是问题的,因为以Sobel方式求完导数后会有负值,还有会大于255的值而你建的Sobel的图像是IPL_DEPTH_8U,也就是8位无符号数,所以Sobel建立的图像位数不够,要16位有符号的,也就是IPL_DEPTH_16S。把建立图像这句改为sobel=cvCreateImage(cvGetSize(frame),IPL_DEPTH_16S,1);运行,发现不报

8、错了,但是Sobel图像显示不出来,这是什么原因呢?原来图像显示是以8位无符号显

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。