OpenCV之濾波操作
影象濾波與濾波器
首先我們看一下影象濾波的概念。影象濾波,即在儘量保留影象細節特徵的條件下對目標影象的噪聲進行抑制,是影象預處理中不可缺少的操作,其處理效果的好壞將直接影響到後續影象處理和分析的有效性和可靠性。
消除影象中的噪聲成分叫作影象的平滑化或濾波操作。訊號或影象的能量大部分集中在幅度譜的低頻和中頻段是很常見的,而在較高頻段,感興趣的資訊經常被噪聲淹沒。因此一個能降低高頻成分幅度的濾波器就能夠減弱噪聲的影響。
影象濾波的目的有兩個:一是抽出物件的特徵作為影象識別的特徵模式;另一個是為適應影象處理的要求,消除影象數字化時所混入的噪聲。
而對濾波處理的要求也有兩條:一是不能損壞影象的輪廓及邊緣等重要資訊;二是使影象清晰視覺效果好。
平滑濾波是低頻增強的空間域濾波技術。它的目的有兩類:一類是模糊;另一類是消除噪音。(各種“兩",:))
空間域的平滑濾波一般採用簡單平均法進行,就是求鄰近像元點的平均亮度值。鄰域的大小與平滑的效果直接相關,鄰域越大平滑的效果越好,但鄰域過大,平滑會使邊緣資訊損失的越大,從而使輸出的影象變得模糊,因此需合理選擇鄰域的大小。
關於濾波器,一種形象的比喻法是:我們可以把濾波器想象成一個包含加權係數的視窗,當使用這個濾波器平滑處理影象時,就把這個視窗放到影象之上,透過這個視窗來看我們得到的影象。
濾波器的種類有很多, 在新版本的OpenCV中,提供瞭如下五種常用的影象平滑處理操作方法,且他們分別被封裝在單獨的函式中,使用起來非常方便:
- 方框濾波——boxblur函式
- 均值濾波(鄰域平均濾波)——blur函式
- 高斯濾波——GaussianBlur函式
- 中值濾波——medianBlur函式
- 雙邊濾波——bilateralFilter函式
濾波處理分為兩大類:線性濾波和非線性濾波。
線性濾波
方框濾波、均值濾波、高斯濾波
線性濾波兩個訊號之和的響應和他們各自響應之和相等。換句話說,每個畫素的輸出值是一些輸入畫素的加權和,線性濾波器易於構造,並且易於從頻率響應角度來進行分析。
線性濾波器:
線性濾波器經常用於剔除輸入訊號中不想要的頻率或者從許多頻率中選擇一個想要的頻率。
幾種常見的線性濾波器:
允許低頻率通過的低通濾波器。
允許高頻率通過的高通濾波器。
允許一定範圍頻率通過的帶通濾波器。
阻止一定範圍頻率通過並且允許其它頻率通過的帶阻濾波器。
允許所有頻率通過、僅僅改變相位關係的全通濾波器。
阻止一個狹窄頻率範圍通過的特殊帶阻濾波器,陷波濾波器(Band-stop filter)。
方框濾波(box Filter)
方框濾波(box Filter)被封裝在一個名為boxblur的函式中,即boxblur函式的作用是使用方框濾波器(box filter)來模糊一張圖片,從src輸入,從dst輸出。
函式原型如下:
void boxFilter(InputArray src,OutputArray dst, int ddepth, Size ksize, Point anchor=Point(-1,-1), boolnormalize=true, int borderType=BORDER_DEFAULT )
均值濾波
均值濾波就是方框濾波的一個特殊情況。主要方法為鄰域平均法,即用一片影象區域的各個畫素的均值來代替原影象中的各個畫素值。
是最簡單的一種濾波操作,輸出影象的每一個畫素是核視窗內輸入影象對應畫素的畫素的平均值( 所有畫素加權係數相等),其實說白了它就是歸一化後的方框濾波。
我們在進行原始碼剖析時會發現,blur函式內部中其實就是呼叫了一下boxFilter。
均值濾波的缺點就是不能很好地保護細節,在影象去燥的同時也破壞了影象的而細節部分,從而使影象變得模糊,不能很好的去除噪點。
blur函式的原型:
C++: void blur(InputArray src, OutputArraydst, Size ksize, Point anchor=Point(-1,-1), int borderType=BORDER_DEFAULT )
高斯濾波
高斯濾波是一種線性平滑濾波,適用於消除高斯噪聲,廣泛應用於影象處理的減噪過程。
通俗的講,高斯濾波就是對整幅影象進行加權平均的過程,每一個畫素點的值,都由其本身和鄰域內的其他畫素值經過加權平均後得到。高斯濾波的具體操作是:用一個模板(或稱卷積、掩模)掃描影象中的每一個畫素,用模板確定的鄰域內畫素的加權平均灰度值去替代模板中心畫素點的值。
從數學的角度來看,影象的高斯模糊過程就是影象與正態分佈做卷積。由於正態分佈又叫作高斯分佈,所以這項技術就叫作高斯模糊。
GaussianBlur函式的作用是用高斯濾波器來模糊一張圖片,對輸入的影象src進行高斯濾波後用dst輸出。它將源影象和指定的高斯核函式做卷積運算,並且支援就地過濾(In-placefiltering)。
void GaussianBlur(InputArray src,OutputArray dst, Size ksize, double sigmaX, double sigmaY=0, intborderType=BORDER_DEFAULT )
從效果看出,高斯濾波的而模糊感明顯降低。
濾波和模糊
濾波可分低通濾波和高通濾波兩種。而高斯濾波是指用高斯函式作為濾波函式的濾波操作,至於是不是模糊,要看是高斯低通還是高斯高通,低通就是模糊,高通就是銳化。
高斯濾波是指用高斯函式作為濾波函式的濾波操作。
高斯模糊就是高斯低通濾波。
非線性濾波
中值濾波、雙邊濾波
中值濾波
基本思想就是用畫素點的領域灰度的中值來代替該畫素點的灰度值,該方法在去除脈衝噪聲、椒鹽噪聲的同時又能保留影象的細節(不會出現邊緣模糊的情況)。中值濾波在一定的條件下可以克服常見線性濾波器如最小均方濾波、方框濾波器、均值濾波等帶來的影象細節模糊,而且對濾除脈衝干擾及影象掃描噪聲非常有效,也常用於保護邊緣資訊, 儲存邊緣的特性使它在不希望出現邊緣模糊的場合也很有用,是非常經典的平滑噪聲處理方法。
中值濾波跟均值濾波的思想看起來很相似,只是一個取平均值,一個取中位數而已。
中值濾波與均值濾波的比較:均值濾波中噪聲成分會被加入到平均計算,所以輸出是受到噪聲的影響的。但是中值濾波中,由於噪聲成分很難選上,所以基本不影響輸出。因此同樣用3x3區域進行處理,中值濾波消除的噪聲能力更勝一籌。中值濾波無論是在消除噪聲還是儲存邊緣方面都是一個不錯的方法。
當然好的效能也需要付出一點代價的,中值濾波花費的時間是均值濾波的5倍以上。
中值濾波一般採用奇數的卷積核。
中值濾波對一些細節多(特別是細、尖頂的)的影象不太適合
雙邊濾波
雙邊濾波(Bilateral filter)是一種非線性的濾波方法,是結合影象的空間鄰近度和畫素值相似度的一種折衷處理,同時考慮空域資訊和灰度相似性,達到保邊去噪的目的。具有簡單、非迭代、區域性的特點。
雙邊濾波的最大特點就是做邊緣儲存。
效果圖看來,雙邊濾波是所有濾波中最清晰的。
程式碼:
//7.濾波操作
int main()
{
Mat img = imread("dog.jpg");
imshow("原始圖", img);
Mat out;
//方框濾波
boxFilter(img, out, -1, Size(5, 5));//-1指原圖深度
imshow("方框濾波", out);
Mat out2;
blur(img, out2,Size(5, 5));//-1指原圖深度
imshow("均值濾波", out2);
Mat out3;
GaussianBlur(img, out3, Size(3, 3), 0, 0);
imshow("高斯濾波", out3);
Mat out4;
medianBlur(img, out4, 7);//第三個引數表示孔徑的線性尺寸,它的值必須是大於1的奇數
imshow("中值濾波", out4);
Mat out5;
bilateralFilter(img, out5, 25, 25 * 2, 25 / 2);
imshow("雙邊濾波", out5);
waitKey(0);
}
整體效果圖:
參考文獻:
1.https://blog.csdn.net/poem_qianmo/article/details/22745559