Opencv学习之非线性滤波

来源:互联网 发布:金融程序员 编辑:程序博客网 时间:2024/05/18 00:51

中值滤波–medianBlur函数

其基本原理是把数字图像或数字序列中的一点的值用该点的一个邻域中各点值的中值代替,让周围的像素值接近真实值,从而消除孤立的噪声点,对于斑点噪声(脉冲噪声,又称图像扫描噪声)、椒盐噪声尤其适用,并且可以克服图像细节模糊,保护边缘信息。但中值滤波器耗费时间是均值滤波器的5倍以上,并且对一些细节(特别是细、尖顶等)多的图像不太适合。void medianBlur(InputArray,OutputArray,int ksize)*第一个参数,输入图像,当ksize是3或5时,图像深度需为CV_8U、16U、32F其中之一,对于较大孔径尺寸图片,只能是CV_8U。*第二个参数,输出图像。*第三个参数,必须是大于1的奇数。

双边滤波–bilateralFilter函数

其比高斯滤波多了一个高斯方差,是基于空间分布的高斯滤波函数,所以在边缘附近,离得较远的像素不会对边缘上的像素值影响太多,这样就保证了边缘附近像素值的保存。但是,由于保存了过多了高频信息,对于彩色图像里面的高频噪声,双边滤波器不能干净地滤掉,只能对于低频信息进行较好地滤波。其主要目的是保边去噪(保留边缘,去除噪声),具有简单、非迭代、局部的特点。  void bilateralFilter(InputArray,OutputArray,int d,double sigmaColor,double sigmaSpace,int bordertype=BORDER_DEFAULT)*第一个参数,输入图像,8位或者浮点型单通道,三通道图像。*第二个参数,输出图像。*第三个参数,过滤过程中每个像素邻域的直径,若为非正数,则由sigmaSpace计算出来。*第四个参数,颜色空间滤波器的sigma值,值越大,表明该像素邻域内有越宽广的颜色会被混合到一起,产生较大的半相等颜色区域。*第五个参数,坐标空间中的滤波器的sigma值,坐标空间的标注方差,值越大,意味着越远的像素会相互影响,从而使更大的区域中足够相似的颜色获取相同的颜色,当d>0时,d指定了邻域大小且与siamaSpace无关,否则,d正比于sigmaSpace。*第六个参数,由于推断图像外部像素的某种边界模式,一般不用管。
 #include<opencv2/core/core.hpp>#include<opencv2/highgui/highgui.hpp>#include<opencv2/imgproc/imgproc.hpp>#include<iostream>using namespace cv;using namespace std;//全局变量声明***********************************************//存储图片的输入输出图片Mat类型Mat g_srcImage,g_dstImage1,g_dstImage2;//方框,均值,高斯滤波参数值int g_nMedianFilterValue=10;int g_nBilateralFilterValue=10;//全局函数声明***********************************************//轨迹回调函数,方框,均值,高斯滤波static void on_MedianFilter(int,void *);static void on_BilateralFilter(int,void *);//主函数int main(){    system("color5E");    //载入原图     g_srcImage=imread("/Users/new/Desktop/1.jpg",1);    if(!g_srcImage.data){printf("读取源图错误~!\n");return false;}    //复制原图到三个Mat类型中    g_dstImage1=g_srcImage.clone();    g_dstImage2=g_srcImage.clone();    //显示原图    namedWindow("image[origin]",1);    imshow("image[origin]",g_srcImage);    //中值滤波    namedWindow("image[MedianFilter]",1);    createTrackbar("Filter Size ", "image[MedianFilter]", &g_nMedianFilterValue,30,on_MedianFilter);    on_MedianFilter(g_nMedianFilterValue, 0);    //双边滤波    namedWindow("image[BilateralFilter]",1);    createTrackbar("Filter Size ", "image[BilateralFilter]", &g_nBilateralFilterValue, 30,on_BilateralFilter);    on_BilateralFilter(g_nBilateralFilterValue, 0);    waitKey();    return 0;}//中值滤波操作的回调函数static void on_MedianFilter(int,void *){    medianBlur(g_srcImage,g_dstImage1,g_nMedianFilterValue*2+1);    imshow("image[MedianFilter]",g_dstImage1);}//双边滤波操作的回调函数static void on_BilateralFilter(int,void *){    bilateralFilter(g_srcImage,g_dstImage2,g_nBilateralFilterValue,g_nBilateralFilterValue*2,g_nBilateralFilterValue/2);    imshow("image[BilateralFilter]",g_dstImage2);}

原始图片:
这里写图片描述

中值滤波:
这里写图片描述

双边滤波:
这里写图片描述

阅读全文
0 0
原创粉丝点击