OpenCV学习-4:图像滤波处理

OpenCV中图像滤波函数:函数

方框滤波——boxblur函数
均值滤波(邻域平均滤波)——blur函数
高斯滤波——GaussianBlur函数
中值滤波——medianBlur函数
双边滤波——bilateralFilter函数
其中方框滤波,均值滤波和高斯滤波属于线性滤波,中值滤波和双边滤波属于非线性滤波ui

一、方框滤波boxblurspa

boxFilter(image, out, -1, Size(pos+1, pos+1));

二、均值滤波code

blur(*((Mat*)data), out, Size(pos+1, pos+1));

均值滤波是均一化后的方框滤波,OpenCV内部调用的也是方框滤波函数。string

三、高斯滤波it

//高斯滤波的size值必须为正数和奇数,所以要pos*2+1
GaussianBlur(*((Mat*)data), out, Size(pos*2+1, pos*2+1), 0, 0);

四、中值滤波opencv

//中值滤波的参数必须是大于1的奇数,好比:3,5,7,9 .
medianBlur(*((Mat*)data), out, pos*2+3);

五、双边滤波class

bilateralFilter(*((Mat*)data), out, pos, pos*2, pos/2);

 

示例代码:gui

#include "opencv2/core/core.hpp"
#include"opencv2/highgui/highgui.hpp"
#include"opencv2/imgproc/imgproc.hpp"

using namespace std;
using namespace cv;

const string wndboxblur = "方框滤波";
const string wndblur = "均值滤波";
const string wndgsblur = "高斯滤波";
const string wndmedian = "中值滤波";
const string wndbilateral = "双边滤波";

//方框滤波
void cvBoxBlur(const Mat& image)
{
    auto fun = [](int pos, void* data){
        Mat out;
        boxFilter(*((Mat*)data), out, -1, Size(pos+1, pos+1));
        imshow(wndboxblur, out);
    };
    int val = 5;
    namedWindow(wndboxblur);
    createTrackbar("核心大小", wndboxblur, &val, 30, fun, (void*)&image);
    fun(5, (void*)&image);
}

//均值滤波
void cvBlur(const Mat& image)
{
    auto fun = [](int pos, void* data){
        Mat out;
        blur(*((Mat*)data), out, Size(pos+1, pos+1));
        imshow(wndblur, out);
    };
    int val = 5;
    namedWindow(wndblur);
    createTrackbar("核心大小", wndblur, &val, 30, fun, (void*)&image);
    fun(5, (void*)&image);
}

//高斯滤波
void cvGsBlur(const Mat& image)
{
    auto fun = [](int pos, void* data){
        Mat out;
        //高斯滤波的size值必须为正数和奇数,所以要pos*2+1
        GaussianBlur(*((Mat*)data), out, Size(pos*2+1, pos*2+1), 0, 0);
        imshow(wndgsblur, out);
    };
    int val = 10;
    namedWindow(wndgsblur);
    createTrackbar("核心大小", wndgsblur, &val, 30, fun, (void*)&image);
    fun(1, (void*)&image);
}

//中值滤波
void cvMedianBlur(const Mat& image)
{
    auto fun = [](int pos, void* data){
        Mat out;
        //中值滤波的参数必须是大于1的奇数,好比:3,5,7,9 .
        medianBlur(*((Mat*)data), out, pos*2+3);
        imshow(wndmedian, out);
    };
    int val = 10;
    namedWindow(wndmedian);
    createTrackbar("核心大小", wndmedian, &val, 30, fun, (void*)&image);
    fun(1, (void*)&image);
}

//双边滤波
void cvBilateralFilter(const Mat& image)
{
    auto fun = [](int pos, void* data){
        Mat out;
        bilateralFilter(*((Mat*)data), out, pos, pos*2, pos/2);
        imshow(wndbilateral, out);
    };
    int val = 10;
    namedWindow(wndbilateral);
    createTrackbar("核心大小", wndbilateral, &val, 50, fun, (void*)&image);
    fun(1, (void*)&image);
}

int main( )
{
    Mat image=imread("mv.jpg"); //加载显示原图
    imshow("原图", image);

    //cvBoxBlur(image);
    //cvBlur(image);
    //cvGsBlur(image);

    cvMedianBlur(image);
    cvBilateralFilter(image);

    waitKey(0 );
}
相关文章
相关标签/搜索