C++ Opencv——影象處理——濾波
阿新 • • 發佈:2018-12-20
https://blog.csdn.net/zoucharming/article/details/70197863
在影象處理中,儘可能消除圖片中的噪聲,消除噪聲就需要用到濾波,在本次opencv學習中,學習了三個濾波方式。
(1)平均濾波,就是將一個區域內的畫素值求和取平均值,然後用這個平均值替換區域中心的畫素值。
blur(源Mat物件,目標Mat物件,Size物件,Point物件)//Size物件用來確定區域大小,Point物件如果x,y都是-1則表示更新區域中心的畫素。
(2)高斯濾波,也是將一個區域的畫素值求取平均值替換區域中心的畫素值,但是是加權平均,權重按照二維正態分佈。
GaussianBlur(源Mat物件,目標Mat物件,Size物件,x方向正太分佈引數,y方向正太分佈引數)
(3)中值濾波,之前的兩個濾波都有個問題,如果區域中有極端值,很可能影響濾波效果,中值濾波採用區域中的中值來替換,有利於克服椒鹽噪聲。
medianBlur(源Mat物件,目標Mat物件,int size)//這裡的size表示正方形區域的邊長
(4)雙邊濾波,之前的濾波還有個問題,他們都會把輪廓給模糊了,有一些區域之間相差較大的畫素,這往往能看出輪廓,所以如果我們給個限制範圍,如果兩點間的畫素值差距大於這個範圍就不濾波了,保留影象輪廓
bilateralFilter(源Mat物件,目標Mat物件,int 區域半徑,int 限制範圍,int space)//space是當區域半徑給的是0時,用來計算區域範圍的,一般情況下沒用,隨便給個數就行。
#include<opencv2\opencv.hpp> #include<iostream> #include<math.h> #include<algorithm> using namespace std; using namespace cv; int main() { Mat src; src = imread("1.jpg", 1); if (src.empty()) { printf("cannot load!!\n"); return -1; } namedWindow("原圖"); imshow("原圖", src); Mat dst,dst1; blur(src, dst, Size(3, 3), Point(-1, -1)); namedWindow("均值濾波"); imshow("均值濾波", dst); GaussianBlur(src, dst, Size(5, 5), 5, 5); namedWindow("高斯濾波"); imshow("高斯濾波", dst); medianBlur(src, dst, 5); namedWindow("中值濾波"); imshow("中值濾波", dst); bilateralFilter(src, dst, 5, 100, 3); namedWindow("雙邊濾波"); imshow("雙邊濾波", dst); waitKey(0); return 0; }
雙邊濾波效果最好,既保留了輪廓,面板更加平滑,如果再用掩膜提高下對比度,就可以進行修圖了。