opencv:中值濾波、雙邊濾波、均值濾波、高斯濾波、方框濾波

濾波器:

 

濾波器種類

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

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


圖像濾波要求:       

 不能損害圖像的輪廓和邊緣,

  圖像清晰視覺效果更好

 

 

(1)方框濾波

它是濾波器中最簡單的,是通過濾波器核K內每個像素值的平均值得到的,濾波核如下

參數:

 InputArray src: 輸入圖像,可以是Mat類型 
. OutputArray dst: 經濾波後輸出圖像 
. int ddepth: 目標圖像的深度,若設置爲-1,則深度與原圖像深度相同 
. Size ksize: Size類型,內核的大小,一般用Size(w, h)表示,如Size(3, 3)表示kernel窗口大小爲3x3 
. Point anchor = Point(-1,-1): 進行濾波操作的點,如果是默認值(-1, -1)說明對上述窗口中心點所對應的像素點進行操作 
. bool normalize = true: 內核是否被歸一化處理,有默認值true 
. int borderType = BORDER_DEFAULT: 用於腿短圖像外部像素的某種便捷模式,有默認值BORDER_DEFAULT. 

(2)均值濾波

就是歸一化後的方框濾波,對於方框濾波,若normalize=true,則方框濾波變爲均值濾波(所有像素的加權係數相等),歸一化就是將要處理的量縮放到一定範圍,比如(0,1)。

(3)高斯濾波

高斯濾波可以很好的消除噪聲,高斯模糊對圖像來說就是一個低通濾波器;數學角度來講,就是圖像與正態分佈做卷積;其就是每個像素點本身和鄰域內的其他的像素值加權平均;它是圖像平滑的重要方式,能有效抑制噪聲,達到圖像平滑的效果;平均模板對四周像素的使用是一視同仁的,這樣的話整幅圖處理後看上去就會非常的模糊;然而高斯濾波打破了這樣的侷限,分配以不同的權重,隨着距離中心距離的增大,權重將迅速減小,從而確保中心的像素點看起來更像是接近與它更近的像素點,這樣圖像的連續性得到了保證!

參考:https://blog.csdn.net/zhangfuliang123/article/details/76100973

(4) 中值濾波

中值濾波方法是,對待處理的當前像素,選擇一個模板,該模板爲其鄰近的若干個像素組成,對模板的像素由小到大進行排序,再用模板的中值來替代原像素的值的方法。其思想是用像素點鄰域灰度值的中值代替該像素的灰度值,有利於去除脈衝噪聲及椒鹽噪聲,中值濾波花費時間比均值濾波久,噪聲消除能力更強,不利於去除高斯噪聲

 

(5)雙邊濾波

雙邊濾波是一種可以保邊去噪的濾波器,與高斯濾波器相比,對於圖像的邊緣信息能過更好的保存。其原理爲一個與空間距離相關的高斯函數與一個灰度距離相關的高斯函數相乘,優化後的權係數再與圖像信息作卷積運算,這樣就能在濾波的同時考慮到圖像信息中的圖像邊緣信息,使圖像在正常Gauss濾波後很模糊的邊緣信息得以保持清晰,並且圖像邊緣更加平滑,次方法對於彩色和灰度圖像的濾波均適用,很強的實用性。

https://blog.csdn.net/Jfuck/article/details/8932978

空間距離:指的是當前點與中心點的歐式距離。空間域高斯函數其數學形式爲,其中(xi,yi)爲當前點位置,(xc,yc)爲中心點的位置,sigma爲空間域標準差:

灰度距離:指的是當前點灰度與中心點灰度的差的絕對值。值域高斯函數其數學形式爲,其中gray(xi,yi)爲當前點灰度值,gray(xc,yc)爲中心點灰度值,sigma爲值域標準差:

雙邊濾波器的加權係數是這兩部分因子的非線性組合,空間鄰近度因子Ws和亮度相似度因子Wr的乘積。前者隨着像素點與中心點之間歐幾里德距離的增加而減小,後者隨着兩像素亮度值之差的增大而減小。在圖像變化平緩的區域,鄰域內像素亮度值相差不大,雙邊濾波轉化爲高斯低通濾波器;在圖像變化劇烈的區域,濾波器利用邊緣點附近亮度值相近的像素點的亮度值平均代替原亮度值。因此,雙邊濾波器既平滑濾波了圖像,又保持了圖像的邊緣。雙邊濾波器受3個參數的控制:濾波器半寬N、參數δs和δr。N越大,平滑作用越強;δs和δr分別控制着空間鄰近度因子Ws和亮度像似度因子Wr的衰減程度。

https://www.cnblogs.com/walccott/p/4957108.html

 

 

標準函數

方框濾波

void boxFilter(InputArray src, OutputArray dst, int ddepth, Size ksize, Point anchor=Point(-1,-1), bool normalize=true, int borderType=BORDER_DEFAULT )

均值濾波

void blur(Input src, OutputArray dst, Size ksize, Point anchor = Point(-1,-1), int borderType = BORDER_DEFAULT)

高斯濾波

void GaussianBlur(InputArray src, OutputArray dst, Size ksize, double sigmaX, double sigmaY = 0, int borderType = BORDER_DEFAULT)

中值濾波

void medianBlur(InputArray src, OutputArray dst, int ksize)

雙邊濾波

void bilateralFilter(InputArray src, OutputArray dst, int d, double sigmaColor, double sigmaSpace, int borderType = BORDER_DEFAULT)

 

例子:

#include <iostream>
#include <stdio.h>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>

using namespace std;
using namespace cv;


int main()
{
	Mat srcImage, dstImage;
	srcImage = imread("D://image//lena.png");

	//判斷圖像是否加載成功
	if (srcImage.empty())
	{
		cout << "圖像加載失敗!" << endl;
		return -1;
	}
	else
		cout << "圖像加載成功!" << endl << endl;

	namedWindow("原圖像", WINDOW_AUTOSIZE);
	imshow("原圖像", srcImage);            //顯示原圖像

//boxFilter(srcImage, dstImage, -1,  Size(3, 3), Point(-1, -1), false); //方框濾波未歸一化	
//boxFilter(srcImage, dstImage, -1, Size(3, 3)); //方框濾波歸一化
 //blur(srcImage, dstImage, Size(3,3));  //均值濾波
//GaussianBlur(srcImage, dstImage, Size(3,3),  5, 0);//高斯濾波
//medianBlur(srcImage, dstImage, 3); //中值濾波
    
    bilateralFilter(srcImage, dstImage, 3, 11 * 2, 11 / 2);
	imshow("雙邊k3", dstImage);
	bilateralFilter(srcImage, dstImage, 7, 11 * 2, 25 / 2);
	imshow("雙邊k7", dstImage);
	bilateralFilter(srcImage, dstImage, 11, 11 * 2, 25 / 2);
	imshow("雙邊k11", dstImage);




	imshow("方框濾波", dstImage);
	waitKey(0);
	return 0;
}

 

結果比較

下圖爲方框濾波沒有歸一化的結果

下圖爲歸一化後的方框濾波結果,可發現其與均值濾波相同

        

均值濾波

高斯濾波  c格碼:0.2

高斯濾波  c格碼:5

中值濾波

原圖--------------濾波窗口3---------------濾波窗口7-------------------------濾波窗口11

雙邊濾波

 

 

 

 

 

 

 

 

 

參考:https://blog.csdn.net/KYJL888/article/details/78319139

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章