代入x,y 值可以算出F(X,Y)的值。
2.2 非线性滤波器
1.中值滤波:像素点 邻域灰度值的中值代替该像素点的灰度值。 2.双边滤波:基于空间分布的高斯滤波函数,比高斯滤波多一个sigma-d的高斯方差。
2.2.1 Opencv中提供的非线性滤波函数 1.中值滤波:medianBlur函数
函数原型:void medianBlur(InputArray src,OutputArray dst,int ksize) 参数说明:InputArray,输入图像src。 OutputArray ,输出图像dst.
int类型ksize,孔径的线性尺寸,这个参数必须是大于1的奇数
2.双边滤波:bilateralFilter(InputArray src,OutputArray dst, int d,
double sigmaColor,double sigmaSpace,
int borderType=BORDER_DEFAULT) 参数说明:InputArray,输入图像src。 OutputArray ,输出图像dst.
Int类型的d,表示过滤过程每个像素邻域的直径 double类型的sigmaColor,表示颜色滤波器的sigma值 Double类型的sigmaSpace,表示坐标空间的sigma值 Int类型boderType,推断图像外部像素的某种边界模式。默认值BORDER_DEFAULT。
)
三. 几种滤波器的使用
本示例在opencv3.0+VS2012运行环境下测试,不管利用opencv或者VS什么版本其实程序都是一样的。只不过在包含头文件时注意位置就好了。
#include
#define WINDOWS_NAME1 \【原图】\ #define WINDOWS_NAME2 \【方框滤波】\ #define WINDOWS_NAME3 \【均值滤波】\ #define WINDOWS_NAME4 \【高斯滤波】\ #define WINDOWS_NAME5 \【中值滤波】\ #define WINDOWS_NAME6 \【双边滤波】\ int main() {
system(\);//把dos框背景颜色改变,只是看看效果,
默认dos框背景为黑色。
Mat srcImage=imread(\图片
\\\\Example4.jpg\);//读入原图
if (!srcImage.data) {
cout<<\读取srcImage错误~!\< 流,头文件要加“using namespace std;” } //创建5个Mat矩阵用来存放滤波数据,利用clone函数使其大return false; 小和原图大小相同 Mat box_Image=srcImage.clone(); Mat blur_Image=srcImage.clone(); Mat gaussian_Image=srcImage.clone(); Mat median_Image=srcImage.clone(); Mat bilateral_Image=srcImage.clone(); //=================显示原图=================== namedWindow(WINDOWS_NAME1,1); imshow(WINDOWS_NAME1,srcImage); //=================方框滤波=================== namedWindow(WINDOWS_NAME2,1); boxFilter(srcImage,box_Image,-1,Size(3,3),Point(-1,-1),false,B ORDER_DEFAULT); imshow(WINDOWS_NAME2,box_Image); //=================均值滤波=================== namedWindow(WINDOWS_NAME3,1); blur(srcImage,blur_Image,Size(3,3),Point(-1,-1),BORDER_DE FAULT); imshow(WINDOWS_NAME3,blur_Image); //=================高斯滤波=================== namedWindow(WINDOWS_NAME4,1); GaussianBlur(srcImage,gaussian_Image,Size(3,3),0,0,BORDE R_DEFAULT); imshow(WINDOWS_NAME4,gaussian_Image); //=================中值滤波=================== namedWindow(WINDOWS_NAME5,1); medianBlur(srcImage,median_Image,7); imshow(WINDOWS_NAME5,median_Image); //=================双边滤波=================== namedWindow(WINDOWS_NAME6,1); bilateralFilter(srcImage,bilateral_Image,25,25*2,25/2,BORDE R_DEFAULT); imshow(WINDOWS_NAME6,bilateral_Image); cvWaitKey(0); return 0; }