OpenCV:濾波操作
阿新 • • 發佈:2018-11-30
轉自: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);
}
效果圖看來,雙邊濾波是所有濾波中最清晰的。