cvSmooth 有5种滤波模式的图像模糊平滑函数
函数 cvSmooth 可使用简单模糊、简单无缩放变换的模糊、中值模糊、高斯模糊、双边滤波的任何一种方法平滑图像。每一种方法都有自己的特点以及局限。没有缩放的图像平滑仅支持单通道图像,并且支持8位到16位的转换(与cvSobel和cvaplace相似)和32位浮点数到32位浮点数的变换格式。简单模糊和高斯模糊支持 1- 或 3-通道, 8-比特和 32-比特浮点图像。这两种方法可以(in-place)方式处理图像。中值和双向滤波工作于 1- 或 3-通道, 8-位图像,但是不能以in-place 方式处理图像。
void cvSmooth( const CvArr* src, CvArr* dst, int smoothtype=CV_GAUSSIAN,
int param1=3, int param2=0, double param3=0 ,doubleparam4=0);
参数分析:
src:输入图像.
dst:输出图像.
smoothtype:平滑方法
CV_BLUR_NO_SCALE (简单不带尺度变换的模糊) :
对每个象素的param1×param2 领域求和。如果邻域大小是变化的,可以事先利用函数 cvIntegral 计算积分图像。
CV_BLUR (simple blur) :
对每个象素param1×param2邻域求和并做尺度变换 1/(param1.param2).(参数值越小,滤波 效果更好一些3,4左右)
CV_GAUSSIAN (gaussian blur) :
对图像进行核大小为 param1×param2 的高斯卷积 高斯模糊会磨平边缘轮廓
CV_MEDIAN (median blur) :
对图像进行核大小为param1×param1 的中值滤波(i.e. 邻域是方的).
CV_BILATERAL (双向滤波) :
应用双向 3x3滤波,彩色sigma=param1,空间sigma=param2. 平滑操作的第一个参数.
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和cvLaplace相似)和32位浮点数到32位浮点数的变换格式。
简单模糊和高斯模糊支持 1- 或 3-通道, 8-比特和 32-比特浮点图像。这两种方法可以(in-place)方式处理图像。
中值和双向滤波工作于 1- 或 3-通道, 8-位图像,但是不能以in-place 方式处理图像.
中值滤波法是一种非线性平滑技术,它将每一象素点的灰度值设置为该点某邻域窗口内的所有象素点灰度值的中值。实现方法:
1,通过从图像中的某个采样窗口取出奇数个数据进行排序
2,用排序后的中值取代要处理的数据即可
3,中值滤波法对消除椒盐噪音非常有效,在光学测量条纹图象的相位分析处理方法中有特殊作用,但在条纹中心分析方法中作用不大。中值滤波在图像处理中,常用于用来保护边缘信息,是经典的平滑噪声的方法。
中值滤波是基于排序统计理论的一种能有效抑制噪声的非线性信号处理技术,中值滤波的基本原理是把数字图像或数字序列中一点的值用该点的一个邻域中各点值的中值代替,让周围的像素值接近的值,从而消除孤立的噪声点。方法是去某种结构的二维滑动模板,将板内像素按照像素值的大小进行排序,生成单调上升(或下降)的为二维数据序列。二维中值滤波输出为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-Laplace变换,其实就是为了得到较好的图像边缘,先对图像做Gauss平滑滤波,剔除噪声,然后求二阶导矢,用二阶导的过零点确定边缘,在计算时也是频域乘积=>空域卷积。
滤波器就是建立的一个数学模型,通过这个模型来将图像数据进行能量转化,能量低的就排除掉,噪声就是属于低能量部分
其实编程运算的话就是一个模板运算,拿图像的八连通区域来说,中间点的像素值就等于八连通区的像素值的均值,这样达到平滑的效果
若使用理想滤波器,会在图像中产生振铃现象。采用高斯滤波器的话,系统函数是平滑的,避免了振铃现象。
代码如下:
#include <cv.h>
#include <highgui.h>
int main(int argc, char* argv[])
{
IplImage *input=cvLoadImage("f1.jpg");
cvNamedWindow("yuantu",CV_WINDOW_AUTOSIZE);
cvShowImage("yuantu",input);
IplImage *out_three_img=cvCreateImage(cvGetSize(input),input->depth,input->nChannels);
assert(out_three_img!=NULL);
IplImage *out_five_img=cvCreateImage(cvGetSize(input),input->depth,input->nChannels);
assert(out_five_img!=NULL);
IplImage *out_five_twice_img=cvCreateImage(cvGetSize(input),input->depth,input->nChannels);
assert(out_five_twice_img!=NULL);
IplImage *out_nine_img=cvCreateImage(cvGetSize(input),input->depth,input->nChannels);
assert(out_nine_img!=NULL);
IplImage *out_eleven_img=cvCreateImage(cvGetSize(input),input->depth,input->nChannels);
assert(out_eleven_img!=NULL);
IplImage *out_eleven_twice_img=cvCreateImage(cvGetSize(input),input->depth,input->nChannels);
assert(out_eleven_twice_img!=NULL);
cvSmooth(input,out_three_img,CV_GAUSSIAN,3,3);//3*3平滑窗口
cvSmooth(input,out_five_img,CV_GAUSSIAN,5,5);//5*5窗口
cvSmooth(input,out_nine_img,CV_GAUSSIAN,9,9);//9*9
cvSmooth(input,out_eleven_img,CV_GAUSSIAN,11,11);//11*11
cvSmooth(out_five_img,out_five_twice_img);//双5*5滤波
cvSmooth(out_eleven_img,out_eleven_twice_img);//双11*11滤波
cvNamedWindow("3*3",CV_WINDOW_AUTOSIZE);
cvNamedWindow("5*5",CV_WINDOW_AUTOSIZE);
cvNamedWindow("9*9",CV_WINDOW_AUTOSIZE);
cvNamedWindow("11*11",CV_WINDOW_AUTOSIZE);
cvNamedWindow("两次5*5",CV_WINDOW_AUTOSIZE);
cvNamedWindow("两次11*11",CV_WINDOW_AUTOSIZE);
cvShowImage("3*3",out_three_img);
cvShowImage("5*5",out_five_img);
cvShowImage("9*9",out_nine_img);
cvShowImage("11*11",out_eleven_img);
cvShowImage("两次5*5",out_five_twice_img);
cvShowImage("两次11*11",out_eleven_twice_img);
cvSaveImage("r3.jpg",out_three_img);
cvSaveImage("r5.jpg",out_five_img);
cvSaveImage("r9.jpg",out_nine_img);
cvSaveImage("r11.jpg",out_eleven_img);
cvSaveImage("r5*2.jpg",out_five_twice_img);
cvSaveImage("r11*2.jpg",out_eleven_twice_img);
cvWaitKey();
cvReleaseImage(&input);
cvReleaseImage(&out_three_img);
cvReleaseImage(&out_five_img);
cvReleaseImage(&out_nine_img);
cvReleaseImage(&out_eleven_img);
cvReleaseImage(&out_five_twice_img);
cvReleaseImage(&out_eleven_twice_img);
cvDestroyAllWindows();
return 0;
}
效果图:
这个实验主要是使用对称的平滑窗口,大小依次为3*3,5*5,9*9,和11*11的高斯卷积核来进行高斯平滑滤波,并显示出结果。还用5*5高斯滤波器平滑图像两次和两个11*11平滑器一次来进行对比,最后得出结论。发现卷积核小的比大的要清晰。而且卷积核越大,平滑效果是越模糊,而且,高斯滤波具有明显的磨掉边缘的特性。在轮廓测量中要注意使用。该实验在图像处理领域的应用十分广泛,对人脸识别,车辆检测等具有重要意义。