Opencv图像滤波

opencv支持图像滤波,提供了五个基本算法,分别是方框滤波,均值滤波,高斯滤波,中值滤波以及双边滤波,前三种为线性滤波算法,后两种为非线性滤波算法,

一、方框滤波

首先,线性滤波算法必须知道的概念叫做邻域算子,是指利用一张图片中给点的像素点的周围的像素值决定该给定点的像素的一种算子,在opencv中经常使用,用来做图像的模糊或者是锐化。

方框滤波算法的原理很简单,指定一个XY的矩阵大小,目标像素的周围XY矩阵内的像素全部相加作为目标像素的值,就这么简单.

API: void boxFilter(源图像,目的图像,int 输出图像的深度,Size 邻域算子的大小,Point 锚点,bool 归一化标志,int 边界模式).

二、均值滤波

均值滤波其实就是方框滤波的默认归一化版本,这个算法接口取消了归一化参数,所以实际效果和方框滤波,差异不大

API: void blur(源图,目标图,size,锚点,边界模式);

三、高斯滤波

高斯滤波是专门用于消除满足高斯分布(正态分布)的误差而存在的滤波,此时邻域算子是专门的高斯核,图像中的像素与高斯核做卷积,生成的结果加权平均存放到目标像素中,对于抑制符合正态分布的噪声非常有效,并可以增强图像值不同比例下的图像效果,视觉效果类似于隔了一层半透明玻璃看图像.

API:void GaussianBlur(源图像,目标图像,Size 高斯内核,double 高斯核函数在X方向上的标准差,double 高斯核函数在Y方向的标准差,int 边界模式).

四、中值滤波

线性滤波的基本原理是对指定像素的指定邻域的灰度值进行一个排序,然后选择中间的灰度值来直接替代指定像素的灰度值,从而消除孤立的噪声点,对于斑点噪声和椒盐噪声尤其有用,同时还可以保存边缘.对脉冲型的干扰尤其有效,因为在实际情况中,噪声点的灰度和邻域的值的差别很大,所以,中值一般不容易是噪声点灰度.但是因为基于统计排序,所以运行时间一般是均值滤波的五倍以上.

API:void medianBlur(源图像,目标图像,int 邻域大小)

五、双边滤波

前面的滤波,或多或少的都会使得目标点的像素受到邻域的影响,邻域越大,影响越大,而双边滤波同时考虑了图像的灰度相似性和空间域信息,基本理念是邻域的计算附带权重,距离目标点越远的邻域像素对目标像素的影响越小,也就是权重越低,这样,离得较远的像素就不会对边缘的影响过多,能很好的保存边缘,同时也能滤波部分噪声.但是,双边滤波保存了过多的高频信息,对于彩色图像中的高频噪声,双边滤波不能很好的滤除掉.

API:void bilateralFilter(源图像,目标图像,int 像素邻域直径, ,double 颜色空间滤波器sigma doble 坐标空间滤波器sigma,int 边缘类型);

src:只能處理CV_8UC1、CV_8UC3、CV_32FC1、CV_32FC3這三種。

例程

void imgSmoothing()//滤波操作
{
    Mat srcImg = imread("D:/ImageTest/0tu5px.JPG");
    Mat dstImg1,dstImg2,dstImg3,dstImg4,dstImg5 ;
    cv::cvtColor(srcImg,srcImg,COLOR_RGB2GRAY);//进行,灰度处理
    Size size0 = Size(5, 5);
    boxFilter(srcImg, dstImg1, -1, Size(3, 3), Point(-1, -1), true);  //方框滤波器 bool normalize参数设置为true时等同于均值滤波
    blur(srcImg, dstImg2, size0);  //均值滤波
    GaussianBlur(srcImg, dstImg3, Size(3, 3), 1);//高斯滤波
    medianBlur(srcImg, dstImg4, 5);//中值滤波
    bilateralFilter(srcImg, dstImg5, 5, 10.0, 2.0);//双边滤波
    threshold(dstImg1,dstImg1, 127, 255, THRESH_BINARY);
    threshold(dstImg2,dstImg2, 127, 255, THRESH_BINARY);
    threshold(dstImg3,dstImg3, 127, 255, THRESH_BINARY);
    threshold(dstImg4,dstImg4, 127, 255, THRESH_BINARY);
    threshold(dstImg5,dstImg5, 127, 255, THRESH_BINARY);
    imshow("src", srcImg);
    imshow("boxFilter dst", dstImg1);
    //    imwrite("D:/boxFilter.jpg", dstImg1); //保存结果图片
    imshow("blur dst", dstImg2);
    //     imwrite("D:/blur.jpg", dstImg2); //保存结果图片
    imshow("GaussianBlur dst", dstImg3);
    imshow("medianBlur dst", dstImg4);
    imshow(" bilateralFilter dst", dstImg5);
    waitKey(0);
}

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×