opencv笔记 4.线性和非线性滤波

本文列举了opencv里最常用的线性和非线性滤波函数,并举例实现了各个函数。

#include<cv.hpp>
#include<iostream>

using namespace std;
using namespace cv;

//定义一个mat数据srcImge用来存放图像,一个控制条初始值和五个控制条调用函数
Mat srcImage;
int currentvalue = 3;

void on_MeanBlur(int, void*);
void on_GaussianBlur(int, void*);
void on_BoxBlur(int, void*);
void on_MeanBlur(int, void*);
void on_MedianBlur(int, void*);
void on_BilateralBlur(int, void*);

int main()
{
    //读图并显示
    srcImage = imread("1.tif");
    imshow("原图", srcImage);

    //创建五个窗口,依附于每个窗口创建一个控制条,用控制条调用滤波函数(线性:均值、高斯和方框滤波;非线性:中值、双边)
    namedWindow("均值");
    createTrackbar("内核:", "均值", &currentvalue, 30, on_MeanBlur);
    on_MeanBlur(currentvalue,0);

    namedWindow("高斯");
    createTrackbar("内核:", "高斯", &currentvalue, 30, on_GaussianBlur);
    on_GaussianBlur(currentvalue, 0);

    namedWindow("方框");
    createTrackbar("内核:", "方框", &currentvalue, 30, on_BoxBlur);
    on_BoxBlur(currentvalue, 0);

    namedWindow("中值");
    createTrackbar("内核:", "中值", &currentvalue, 30, on_MedianBlur);
    on_MedianBlur(currentvalue, 0);

    namedWindow("双边");
    createTrackbar("内核:", "双边", &currentvalue, 30, on_BilateralBlur);
    on_BilateralBlur(currentvalue, 0);


    waitKey();
    return 0;
}


//五个控制条函数的调用函数,前三个size里都有加一操作,是因为内核必须为正数,即大于零,第四个 2*currentvalue+1 是因为这个参数得取大于一的奇数
void on_MeanBlur(int, void*)
{
    Mat dstImage = srcImage.clone();
    blur(srcImage, dstImage,Size(currentvalue+1,currentvalue+1));
    imshow("均值", dstImage);
}


void on_GaussianBlur(int, void*)
{
    Mat dstImage = srcImage.clone();
    GaussianBlur(srcImage, dstImage, Size(2*currentvalue+1, 2*currentvalue+1),0,0);//高斯函数的内核大小必须是正数和奇数
    imshow("高斯", dstImage);
}


void on_BoxBlur(int, void*)
{
    Mat dstImage = srcImage.clone();
    boxFilter(srcImage, dstImage,-1, Size(currentvalue+1, currentvalue+1 ));
    imshow("方框", dstImage);
}


void on_MedianBlur(int, void*)
{
    Mat dstImage = srcImage.clone();
    medianBlur(srcImage, dstImage, 2*currentvalue+1 );
    imshow("中值", dstImage);
}

void on_BilateralBlur(int, void*)
{
    Mat dstImage = srcImage.clone();
    bilateralFilter(srcImage, dstImage, currentvalue, currentvalue * 2, currentvalue/2);
    imshow("双边", dstImage);
}

效果图:opencv笔记 4.线性和非线性滤波_第1张图片

你可能感兴趣的:(函数,opencv,线性,滤波,非线性)