Opencv之图像处理

Posted by jjx on January 10, 2017

图像线性滤波实现,主要包括以下三种

  • 方框滤波
  • 平均滤波
  • 高斯滤波

方框滤波就是没有归一化的均值滤波

void boxFilter(){
    // 载入原图
    Mat image=imread("../img/1.jpg");

    //创建窗口
    namedWindow( "方框滤波【原图】" );
    namedWindow( "方框滤波【效果图】");

    //显示原图
    imshow( "方框滤波【原图】", image );

    //进行方框滤波操作
    Mat out;
    boxFilter( image, out, -1,Size(5, 5));

    //显示效果图
    imshow( "方框滤波【效果图】" ,out );

    waitKey( 0 );
}

均值滤波实现

void averageFilter(){
    //【1】载入原始图
    Mat srcImage=imread("../img/1.jpg");

    //【2】显示原始图
    imshow( "均值滤波【原图】", srcImage );

    //【3】进行均值滤波操作
    Mat dstImage;
    blur( srcImage, dstImage, Size(7, 7));

    //【4】显示效果图
    imshow( "均值滤波【效果图】" ,dstImage );

    waitKey( 0 );
}

高斯滤波实现

void gaussinFilter(){
    // 载入原图
    Mat image=imread("../img/1.jpg");

    //创建窗口
    namedWindow( "高斯滤波【原图】" );
    namedWindow( "高斯滤波【效果图】");

    //显示原图
    imshow( "高斯滤波【原图】", image );

    //进行高斯滤波操作
    Mat out;
    GaussianBlur( image, out, Size( 5, 5 ), 0, 0 );

    //显示效果图
    imshow( "高斯滤波【效果图】" ,out );

    waitKey( 0 );
}

非线性滤波实现
主要包括均值滤波与双边滤波。
中值滤波(Median filter)是一种典型的非线性滤波技术,基本思想是用像素点邻域灰度值的中值来代替该像素点的灰度值,该方法在去除脉冲噪声、椒盐噪声的同时又能保留图像边缘细节,.
双边滤波(Bilateral filter)是一种非线性的滤波方法,是结合图像的空间邻近度和像素值相似度的一种折衷处理,同时考虑空域信息和灰度相似性,达到保边去噪的目的。具有简单、非迭代、局部的特点。
双边滤波器的好处是可以做边缘保存(edge preserving),一般过去用的维纳滤波或者高斯滤波去降噪,都会较明显地模糊边缘,对于高频细节的保护效果并不明显。双边滤波器顾名思义比高斯滤波多了一个高斯方差sigma-d,它是基于空间分布的高斯滤波函数,所以在边缘附近,离的较远的像素不会太多影响到边缘上的像素值,这样就保证了边缘附近像素值的保存。但是由于保存了过多的高频信息,对于彩色图像里的高频噪声,双边滤波器不能够干净的滤掉,只能够对于低频信息进行较好的滤波。

中值滤波

void centerFilter(){
    // 载入原图
    Mat image=imread("../img/1.jpg");

    //创建窗口
    namedWindow( "中值滤波【原图】" );
    namedWindow( "中值滤波【效果图】");

    //显示原图
    imshow( "中值滤波【原图】", image );

    //进行中值滤波操作
    Mat out;
    medianBlur ( image, out, 7);

    //显示效果图
    imshow( "中值滤波【效果图】" ,out );

    waitKey( 0 );
}

双边滤波

void doubleFilter(){
    // 载入原图
    Mat image=imread("../img/1.jpg");

    //创建窗口
    namedWindow( "双边滤波【原图】" );
    namedWindow( "双边滤波【效果图】");

    //显示原图
    imshow( "双边滤波【原图】", image );

    //进行双边滤波操作
    Mat out;
    bilateralFilter ( image, out, 25, 25*2, 25/2 );

    //显示效果图
    imshow( "双边滤波【效果图】" ,out );

    waitKey( 0 );
}