1. 程式人生 > >OpenCV:濾波操作

OpenCV:濾波操作

轉自:https://www.cnblogs.com/skyfsm/p/6873188.html

 

濾波處理分為兩大類:線性濾波和非線性濾波。OpenCV裡有這些濾波的函式,使用起來非常方便,現在簡單介紹其使用方法。

線性濾波:方框濾波、均值濾波、高斯濾波

方框濾波

#include<opencv2\opencv.hpp>   
#include<opencv2\highgui\highgui.hpp>

using namespace std;
using namespace cv;


int main()
{
    Mat img = imread("lol4.jpg");
    imshow("原始圖", img);
    Mat out;
    boxFilter(img, out, -1, Size(5, 5));//-1指原圖深度
    imshow("方框濾波", out);
    waitKey(0);

}

均值濾波
均值濾波就是方框濾波的一個特殊情況。
均值濾波的缺點就是不能很好地保護細節,在影象去燥的同時也破壞了影象的而細節部分,從而使影象變得模糊,不能很好的去除噪點。

#include<opencv2\opencv.hpp>   
#include<opencv2\highgui\highgui.hpp>

using namespace std;
using namespace cv;


int main()
{
    Mat img = imread("lol4.jpg");
    imshow("原始圖", img);
    Mat out;
    blur(img, out,Size(5, 5));//-1指原圖深度
    imshow("均值濾波", out);
    waitKey(0);

}

高斯濾波
高斯濾波,可以消除高斯噪聲,廣泛應用於影象處理的減噪過程。

#include<opencv2\opencv.hpp>   
#include<opencv2\highgui\highgui.hpp>

using namespace std;
using namespace cv;


int main()
{
    Mat img = imread("lol4.jpg");
    imshow("原始圖", img);
    Mat out;
    GaussianBlur(img, out, Size(3, 3), 0, 0);
    imshow("高斯濾波", out);
    waitKey(0);

}

從效果看出,高斯濾波的而模糊感明顯降低

非線性濾波:中值濾波、雙邊濾波

中值濾波

基本思想就是用畫素點的領域灰度的中值來代替該畫素點的灰度值,該方法在去除脈衝噪聲、椒鹽噪聲的同時又能保留影象的細節(不會出現邊緣模糊的情況)

中值濾波跟均值濾波的思想看起來很相似,只是一個取平均值,一個取中位數而已

#include<opencv2\opencv.hpp>   
#include<opencv2\highgui\highgui.hpp>

using namespace std;
using namespace cv;

//中值濾波
int main()
{
    Mat img = imread("lol4.jpg");
    imshow("原始圖", img);
    Mat out;
    medianBlur(img, out, 7);//第三個引數表示孔徑的線性尺寸,它的值必須是大於1的奇數
    imshow("中值濾波", out);
    waitKey(0);

}

現在說說中值濾波與均值濾波的比較:均值濾波中噪聲成分會被加入到平均計算,所以輸出是受到噪聲的影響的。但是中值濾波中,由於噪聲成分很難選上,所以基本不影響輸出。當然好的效能也需要付出一點代價的,中值濾波花費的時間是均值濾波的5倍以上。

中值濾波一般採用奇數的卷積核。

中值濾波對一些細節多(特別是細、尖頂的)的影象不太適合。

雙邊濾波

雙邊濾波的最大特點就是做邊緣儲存。

#include<opencv2\opencv.hpp>   
#include<opencv2\highgui\highgui.hpp>

using namespace std;
using namespace cv;

//雙邊濾波
int main()
{
    Mat img = imread("lol4.jpg");
    imshow("原始圖", img);
    Mat out;
    bilateralFilter(img, out, 25, 25 * 2, 25 / 2);
    imshow("雙邊濾波", out);
    waitKey(0);

}

效果圖看來,雙邊濾波是所有濾波中最清晰的。