OpenCV学习 3:平滑过度与边缘检测

 原创文章,欢迎转载,转载请注明出处 

用来记录学习的过程,这个是简单的相关函数的熟悉,内部机制和选择何种选择函数参数才能达到自己的要求还不太清楚,先学者吧。。后面会慢慢清楚的。
     和前面相比,主要用了三个新的函数cvCreateImage,cvSmooth,cvCanny。
      cvCreateImage用来创建分配图像空间,创建两个,分别保存平滑处理后的图片,然后将平滑处理后的图片(相当于滤波了)进行边缘检测。。代码很简单,opencv很强大,简单的几个函数就完成了如此牛逼的东西。。图像是有了,不过很好奇边缘检测出来的图片怎么提取信息,例如我想直到某个形状的物体在某个地方之类的。。函数原型贴一些吧,wiki上其实写的很清楚

 1 Smooth
 2 各种方法的图像平滑
 3 
 4 void cvSmooth( const CvArr* src, CvArr* dst, int smoothtype=CV_GAUSSIAN, int param1=3, int param2=0, double param3=0, double param4=0 );
 5 src
 6 输入图像.
 7 dst
 8 输出图像.
 9 smoothtype
10 平滑方法:
11 CV_BLUR_NO_SCALE (简单不带尺度变换的模糊) - 对每个象素的 param1×param2 领域求和。如果邻域大小是变化的,可以事先利用函数 cvIntegral 计算积分图像。
12 CV_BLUR (simple blur) - 对每个象素param1×param2邻域 求和并做尺度变换 1/(param1•param2).
13 CV_GAUSSIAN (gaussian blur) - 对图像进行核大小为 param1×param2 的高斯卷积
14 CV_MEDIAN (median blur) - 对图像进行核大小为param1×param1 的中值滤波 (i.e. 邻域是方的).
15 CV_BILATERAL (双向滤波) - 应用双向 3x3 滤波,彩色 sigma=param1,空间 sigma=param2. 关于双向滤波,可参考http://www.dai.ed.ac.uk/CVonline/LOCAL_COPIES/MANDUCHI1/Bilateral_Filtering.html
16 param1
17 平滑操作的第一个参数.
18 param2
19 平滑操作的第二个参数. 对于简单/非尺度变换的高斯模糊的情况,如果param2的值 为零,则表示其被设定为param1。
20 param3
21 对应高斯参数的 Gaussian sigma (标准差). 如果为零,则标准差由下面的核尺寸计算:
22 sigma = (n/2 - 1)*0.3 + 0.8, 其中 n=param1 对应水平核, n=param2 对应垂直核.
23 对小的卷积核 (3×3 to 7×7) 使用如上公式所示的标准 sigma 速度会快。如果 param3 不为零,而 param1 和 param2 为零,则核大小有 sigma 计算 (以保证足够精确的操作).
24 
25 函数 cvSmooth 可使用上面任何一种方法平滑图像。每一种方法都有自己的特点以及局限。
26 
27 没有缩放的图像平滑仅支持单通道图像,并且支持8位到16位的转换(与cvSobel和cvaplace相似)和32位浮点数到32位浮点数的变换格式。
28 
29 简单模糊和高斯模糊支持 1- 或 3-通道, 8-比特 和 32-比特 浮点图像。这两种方法可以(in-place)方式处理图像。
30 
31 中值和双向滤波工作于 1- 或 3-通道, 8-位图像,但是不能以 in-place 方式处理图像.
32 
33 
34 
35 中值滤波
36 中值滤波法是一种非线性平滑技术,它将每一象素点的灰度值设置为该点某邻域窗口内的所有象素点灰度值的中值。实现方法:
37 通过从图像中的某个采样窗口取出奇数个数据进行排序
38 用排序后的中值取代要处理的数据即可
39 中值滤波法对消除椒盐噪音非常有效,在光学测量条纹图象的相位分析处理方法中有特殊作用,但在条纹中心分析方法中作用不大。中值滤波在图像处理中,常用于用来保护边缘信息,是经典的平滑噪声的方法
40 
41 中值滤波原理
42 中值滤波是基于排序统计理论的一种能有效抑制噪声的非线性信号处理技术,中值滤波的基本原理是把数字图像或数字序列中一点的值用该点的一个拎域中各点值的中值代替,让周围的像素值接近的值,从而消除孤立的噪声点。方法是去某种结构的二维滑动模板,将板内像素按照像素值的大小进行排序,生成单调上升(或下降)的为二维数据序列。二维中值滤波输出为g(x,y)=med{f(x-k,y-l),(k,l∈W)} ,其中,f(x,y),g(x,y)分别为原始图像和处理后图像。W为二维模板,通常为2*23*3区域,也可以是不同的的形状,如线状,圆形,十字形,圆环形等。
43 
44 高斯滤波
45 高斯滤波实质上是一种信号的滤波器,其用途是信号的平滑处理,我们知道数字图像用于后期应用,其噪声是最大的问题,由于误差会累计传递等原因,很多图像处理教材会在很早的时候介绍Gauss滤波器,用于得到信噪比SNR较高的图像(反应真实信号)。于此相关的有Gauss-Lapplace变换,其实就是为了得到较好的图像边缘,先对图像做Gauss平滑滤波,剔除噪声,然后求二阶导矢,用二阶导的过零点确定边缘,在计算时也是频域乘积=>空域卷积。
46 
47 滤波器就是建立的一个数学模型,通过这个模型来将图像数据进行能量转化,能量低的就排除掉,噪声就是属于低能量部分
48 
49 其实编程运算的话就是一个模板运算,拿图像的八连通区域来说,中间点的像素值就等于八连通区的像素值的均值,这样达到平滑的效果
50 
51 若使用理想滤波器,会在图像中产生振铃现象。采用高斯滤波器的话,系统函数是平滑的,避免了振铃现象。
 1 Canny
 2 采用 Canny 算法做边缘检测
 3 
 4 void cvCanny( const CvArr* image, CvArr* edges, double threshold1, double threshold2, int aperture_size=3 );
 5 image
 6 单通道输入图像.
 7 edges
 8 单通道存储边缘的输出图像
 9 threshold1
10 第一个阈值
11 threshold2
12 第二个阈值
13 aperture_size
14 Sobel 算子内核大小 (见 cvSobel).
15 函数 cvCanny 采用 CANNY 算法发现输入图像的边缘而且在输出图像中标识这些边缘。threshold1和threshold2 当中的小阈值用来控制边缘连接,大的阈值用来控制强边缘的初始分割。
16 
17 注意事项:cvCanny只接受单通道图像作为输入。
18 外部链接:经典的canny自调整阈值算法的一个opencv的实现见在OpenCV中自适应确定canny算法的分割门限 

最后这个连接好像打不开,这个阀值也不知道怎么用,就随便弄了个先看看。。

上图。。。顺序是  原图---->高斯滤波平滑过度---->平滑后边缘检测后的效果---->原图边缘检测后的效果

上图为原图

上图为平滑过渡后的图

上图为平滑过度有进行边缘检测的图

上图为原图边缘检测的图

彩色图我们看平滑处理后区别不明显,但是边缘检测后,细节部分区别就很明显了。。

posted @ 2014-12-28 11:48  adfjhg  阅读(5597)  评论(0编辑  收藏  举报