OpenCV图像处理(六)图像滤波(1)

2018-04-07  本文已影响0人  行走行囊

1、滤波的作用

图像滤波,是指尽量保留图像细节特征的条件下对目标图像的噪声进行抑制,其处理的好坏直接影响到后续图像处理的有效性和可靠性。滤波操作也叫平滑处理,主要目的有两个:模糊图像和消除噪音。

2、滤波的方式

均值滤波:最简单的一种滤波操作,输出图像的每一个像素是核窗口内输入图像对应像素的平均值(所有像素的加权系数相等)。
高斯滤波:高斯滤波可以消除高斯噪声,其操作原理是用一个模板,该模板的加权系数通过高斯函数确定,再用这个模板对图像的每个像素进行卷积操作,得到滤波后的图像。
中值滤波:其基本思想是用像素点领域灰度值的中值来代替该像素点的灰度值,可有效的去除椒盐噪声。
双边滤波:双边滤波是一种非线性的滤波方法,是结合图像的空间邻近度和像素值的相似度的一种折中处理,同时考虑空域信息和灰度相似性,达到保边去噪的目的。注意,双边滤波对处理彩色图像的椒盐噪声效果不明显。

3、滤波函数

// 均值滤波
void blur( InputArray src, OutputArray dst,
                        Size ksize, Point anchor = Point(-1,-1),
                        int borderType = BORDER_DEFAULT );
// 高斯滤波
void GaussianBlur( InputArray src, OutputArray dst, Size ksize,
                                double sigmaX, double sigmaY = 0,
                                int borderType = BORDER_DEFAULT );
// 中值滤波
void medianBlur( InputArray src, OutputArray dst, int ksize );
// 双边滤波
void bilateralFilter( InputArray src, OutputArray dst, int d,
                                   double sigmaColor, double sigmaSpace,
                                   int borderType = BORDER_DEFAULT );

4、测试代码

// 添加椒盐噪声
void addSalt(Mat& image, int n)//本函数加入彩色盐噪声  
{
    srand((unsigned)time(NULL));
    for (int k = 0; k<n; k++)//将图像中n个像素随机置零  
    {
        int i = rand() % image.cols;
        int j = rand() % image.rows;
        //将图像颜色随机改变  
        image.at<Vec3b>(j, i)[0] = 250;
        image.at<Vec3b>(j, i)[1] = 150;
        image.at<Vec3b>(j, i)[2] = 250;
    }
}
src.png

均值滤波

Mat src = imread("D:/hf.jpg");
Mat blur_img;
blur(src,blur_img,Size(5,5));
imshow("blur_img", blur_img);
blur_img.png

高斯滤波

Mat src = imread("D:/hf.jpg");
Mat gaussianBlur_img;
GaussianBlur(src, gaussianBlur_img,Size(5,5),0,0);
imshow("gaussianBlur_img", gaussianBlur_img);
gaussianBlur_img.png

中值滤波

Mat src = imread("D:/hf.jpg");
Mat mid_img;
addSalt(src, 1000);
medianBlur(src,mid_img,5);
imshow("mid_img", mid_img);
椒盐处理.png mid_img.png

双边滤波

Mat src = imread("D:/hf.jpg");
Mat bilateralFilter_img;
bilateralFilter(src, bilateralFilter_img, 25, 25 * 2, 25 / 2);
imshow("bilateralFilter_img",bilateralFilter_img);
上一篇下一篇

猜你喜欢

热点阅读