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 );
}
相關文章
相關標籤/搜索