OpenCV之cvSmooth函数平滑滤波
1、cvSmooth函数用法
定义原型
<span style="font-size:12px;"> void cvSmooth( const CvArr* src, CvArr* dst,int smoothtype=CV_GAUSSIAN,int param1, int param2, double param3, double param4 );</span>
src:输入图像.
dst:输出图像.
smoothtype平滑方法:
CV_BLUR_NO_SCALE(简单不带尺度变换的模糊)-对每个象素的 param1×param2 领域求和。如果邻域大小是变化的,可以事先利用函数 cvIntegral 计算积分图像. 但是该选项没有计算平均值的操作,所以比 CV_BLUR 的运算快,但是容易溢出,因此输入输出图像必须有不同的数值精度,才能保证不会溢出。 不缩放比例的simple blur 支持8位的图像输入,但是结果必须是 IPL_DEPTH_16S(CV_16S) 或者 IPL_DEPTH_32S(CV_32S) 简单无缩放的滤波不适合 IN_PLACE 方式:因为输入与输出类型必须不同。
CV_BLUR (simple blur)- -对每个象素param1×param2邻域求和并做尺度变换 1/(param1×param2)。
CV_GAUSSIAN(gaussian blur) - -对图像进行核大小为 param1×param2 的高斯卷积。
CV_MEDIAN(median blur) - -对图像进行核大小为param1×param1 的中值滤波 (邻域是方的)。
CV_BILATERAL(双向滤波) - -应用双向 3x3 滤波,彩色 sigma=param1,空间 sigma=param2.。
关于双向滤波,可参考http://www.dai.ed.ac.uk/CVonline/LOCAL_COPIES/MANDUCHI1/Bilateral_Filtering.html。
param1 平滑操作的第一个参数.
param2 平滑操作的第二个参数. 对于简单/非尺度变换的高斯模糊的情况,如果param2的值为零,则表示其被设定为param1。
param3 对应高斯参数的 Gaussian sigma (标准差). 如果为零,则标准差由下面的核尺寸计算:
sigma = (n/2 - 1)*0.3 + 0.8, 其中 n=param1 对应水平核,n=param2 对应垂直核 . 对小的卷积核 (3×3 to 7×7) 使用如上公式所示的标准 sigma 速度会快。如果 param3 不为零,而 param1 和 param2 为零,则核大小由sigma 计算 (以保证足够精确的操作).
函数 cvSmooth 可使用上面任何一种方法平滑图像。每一种方法都有自己的特点以及局限。
没有缩放的图像平滑仅支持单通道图像,并且支持8位到16位的转换(与cvSobel和cvaplace相似)和32位浮点数到32位浮点数的变换格式。
简单模糊和高斯模糊支持 1- 或 3-通道, 8-比特 和 32-比特 浮点图像。这两种方法可以(in-place)方式处理图像。
中值和双向滤波工作于 1- 或 3-通道, 8-位图像,但是不能以 in-place 方式处理图像.
- 中值滤波 中值滤波法是一种非线性平滑技术,它将每一象素点的灰度值设置为该点某邻域窗口内的所有象素点灰度值的中值。实现方法:
- 通过从图像中的某个采样窗口取出奇数个数据进行排序
- 用排序后的中值取代要处理的数据即可
- 中值滤波法对消除椒盐噪音非常有效,在光学测量条纹图象的相位分析处理方法中有特殊作用,但在条纹中心分析方法中作用不大。中值滤波在图像处理中,常用于用来保护边缘信息,是经典的平滑噪声的方法
- 中值滤波原理
中值滤波是基于排序统计理论的一种能有效抑制噪声的非线性信号处理技术,中值滤波的基本原理是把数字图像或数字序列中一点的值用该点的一个拎域中各点值的中值代替,让周围的像素值接近的值,从而消除孤立的噪声点。方法是去某种结构的二维滑动模板,将板内像素按照像素值的大小进行排序,生成单调上升(或下降)的为二维数据序列。二维中值滤波输出为g(x,y)=med{f(x-k,y-l),(k,l∈W)} ,其中,f(x,y),g(x,y)分别为原始图像和处理后图像。W为二维模板,通常为2*2,3*3区域,也可以是不同的的形状,如线状,圆形,十字形,圆环形等。
- 高斯滤波
高斯滤波实质上是一种信号的滤波器,其用途是信号的平滑处理,我们知道数字图像用于后期应用,其噪声是最大的问题,由于误差会累计传递等原因,很多图像处理教材会在很早的时候介绍Gauss滤波器,用于得到信噪比SNR较高的图像(反应真实信号)。于此相关的有Gauss-Lapplace变换,其实就是为了得到较好的图像边缘,先对图像做Gauss平滑滤波,剔除噪声,然后求二阶导矢,用二阶导的过零点确定边缘,在计算时也是频域乘积=>空域卷积。
滤波器就是建立的一个数学模型,通过这个模型来将图像数据进行能量转化,能量低的就排除掉,噪声就是属于低能量部分。其实编程运算的话就是一个模板运算,拿图像的八连通区域来说,中间点的像素值就等于八连通区的像素值的均值,这样达到平滑的效果。若使用理想滤波器,会在图像中产生振铃现象。采用高斯滤波器的话,系统函数是平滑的,避免了振铃现象。
2、实例(OpenCV 2.48+VS2012)
#include<cv.h>
#include<highgui.h>
#include<stdio.h>
void main()
{IplImage* img_src = 0;IplImage* img_dst = 0;char* pictureImage = (char*)("11.bmp");img_src = cvLoadImage(pictureImage, 1);if (!img_src){printf("Could not load image file:%s", pictureImage);exit(0);}img_dst = cvCreateImage(cvGetSize(img_src), IPL_DEPTH_8U, 3);cvNamedWindow("原始图像:", CV_WINDOW_AUTOSIZE);cvMoveWindow("原始图像:", 100, 100);cvShowImage("原始图像:", img_src);cvNamedWindow("简单模糊:", CV_WINDOW_AUTOSIZE);cvMoveWindow("简单模糊:", 200, 100);//(simple blur)简单模糊- -对每个象素param1×param2邻域求和并做尺度变换 1/(param1×param2)。cvSmooth(img_src, img_dst, CV_BLUR, 3, 3, 0, 0);cvShowImage("简单模糊:", img_dst);//注意使用CV_BLUR_NO_SCALE时,原始图像和目标图像,他们的类型不能是一致的。IplImage* img_dst2 = 0;img_dst2 = cvCreateImage(cvGetSize(img_src), IPL_DEPTH_16S, 3);cvNamedWindow("简单不带尺度变换的模糊:", CV_WINDOW_AUTOSIZE);cvMoveWindow("简单不带尺度变换的模糊:", 300, 100);//(简单不带尺度变换的模糊)-对每个象素的 param1×param2 领域求和。如果邻域大小是变化的,可以事先利用函数 cvIntegral 计算积分图像cvSmooth(img_src, img_dst2, CV_BLUR_NO_SCALE, 3, 3, 0, 0);cvShowImage("简单不带尺度变换的模糊:", img_dst2);cvNamedWindow("高斯卷积:", CV_WINDOW_AUTOSIZE);cvMoveWindow("高斯卷积:", 400, 100);//对图像进行核大小为 param1×param2 的高斯卷积。cvSmooth(img_src, img_dst, CV_GAUSSIAN, 3, 3, 0, 0);cvShowImage("高斯卷积:", img_dst);cvNamedWindow("中值滤波:", CV_WINDOW_AUTOSIZE);cvMoveWindow("中值滤波:", 500, 100);//对图像进行核大小为param1×param1 的中值滤波 (邻域是方的)。cvSmooth(img_src, img_dst, CV_MEDIAN, 3, 3, 0, 0);cvShowImage("中值滤波:", img_dst);// cvSmooth(pFrameMat,pFrameMat,CV_BILATERAL,3,0,0);//双向滤波 //参数不对,改成 //cvSmooth(pFrameMat,pFrameMat,CV_BILATERAL,3,3,11,11); //试试,后面两个参数分别代表了位置上和颜色上的sigma值,不能设为0的 cvNamedWindow("双向滤波:", CV_WINDOW_AUTOSIZE);cvMoveWindow("双向滤波:", 600, 100);//(双向滤波) - -应用双向 3x3 滤波,彩色 sigma=param1,空间 sigma=param2.。cvSmooth(img_src, img_dst, CV_BILATERAL, 3, 3, 11, 11);cvShowImage("双向滤波:", img_dst);cvWaitKey(0);cvReleaseImage(&img_src);cvReleaseImage(&img_dst);cvDestroyWindow("原始图像:");cvDestroyWindow("简单不带尺度变换的模糊:");cvDestroyWindow("高斯卷积:");cvDestroyWindow("中值滤波:");cvDestroyWindow("双向滤波:");
}
从结果可以看出,对于椒盐噪声,3x3中值滤波已有很好的效果。
OpenCV之cvSmooth函数平滑滤波相关推荐
- OpenCV之canny()函数,边缘检测,高斯平滑滤波的理解
草鸡详细的canny()函数理解和代码实现 一个电脑小白的自我成长之路^_&. canny()边缘检测过程 1.Canny边缘检测算子是John F. Canny于 1986 年开发出来的一个 ...
- opencv blur函数——均值滤波
本文参考网址: OpenCV成长之路(7):图像滤波 openCV 低通滤波blur函数 opencv-均值滤波blur解析 [OpenCV入门教程之八]线性邻域滤波专场:方框滤波.均值滤波与高斯滤波 ...
- OpenCV(十一)图像滤波(平滑处理)(平均、中值、高斯、双边滤波)
目录 一.基础理论 1.图像噪声 1-1.椒盐噪声 1-2.高斯噪声 2.滤波 3.线性滤波 1.概述 2.线性滤波原理: 二.均值滤波(cv::blur())(简单滤波) 1.原理 2.API 三. ...
- OpenCV中的5种平滑滤波操作
平滑滤波是一种简单又常见的图像处理操作.平滑图像的目的有很多,但通常都是为了减少噪声和伪影. 在OpenCV中共有5种平滑滤波操作,分别是以下几种: 实验测试代码如下: #include<ios ...
- 图像边缘检测--OpenCV之cvCanny函数
图像边缘检测--OpenCV之cvCanny函数 分类: C/C++ void cvCanny( const CvArr* image, CvArr* edges, double threshold1 ...
- opencv(4)图像滤波
都是一些常用函数,但是可能太常用了,里面的一些关键点,没做过多的研究,今天主要对函数中特殊的地方做出分析 1.cvSmooth 图像滤波 CV_BLUR_NO_SCALE (简单不带尺度变换的模糊) ...
- OpenCV各模块函数使用实例(5)--特征检测(Feature Detection)
特征检测是检测图像中的特征信息,比如边缘,线段,角点位置等.在OpenCV中提供了各种特征检测函数和特征提取函数,其中包括有边缘检测(canny),角点检测等,如:Harris角点.ShiTomasi ...
- 《OpenCv视觉之眼》Python图像处理五 :Opencv图像去噪处理之均值滤波、方框滤波、中值滤波和高斯滤波
本专栏主要介绍如果通过OpenCv-Python进行图像处理,通过原理理解OpenCv-Python的函数处理原型,在具体情况中,针对不同的图像进行不同等级的.不同方法的处理,以达到对图像进行去噪.锐 ...
- 图像处理(一):平滑滤波
平滑处理,有时也称模糊处理,是图像处理领域最常用的操作.平滑的目的主要是用来去除噪声.通常平滑操作是通过卷积操作(注:实际上是相关操作,后面的叙述对这两个操作不加区分)完成.下面介绍几种常用的平滑滤波 ...
最新文章
- 马斯克Neuralink被曝“虐杀实验猴”,140万元美金项目遭谴责
- 部分 VII. Array
- oracle中怎样查询用户权限
- 聚类算法:Hierarchical Clustering层次聚类
- 海量数据处理分析(部分)
- thinkphp 相关
- 今天发个技术贴,增加自信心
- 广度优先搜索算法(Breath-first Search)是如何搜索一张图的?
- rsync工具介绍,rsync常用选项,rsync通过ssh同步
- 安装Centos7操作系统教程
- 【设计】电压电流偏置
- Matlab顶级期刊配色工具Rggsci
- WXS脚本之WXS语法
- 一文读懂新华三引领Wi-Fi 6市场的秘密
- 3.Hadoop3.x 项目测试
- android 微信分身开发,【技巧】2021安卓手机微信分身方法
- 叱咤风云,领袖聚合——共论云端现代化实践之道
- 博弈论又称对策论的入门及在军事博弈问题上的简单实战
- PS无法直接拖入图片如何解决?
- loadrunner测试论坛