1. 程式人生 > >opencv方框、高斯、均值、中值、雙邊濾波

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

opencv中有多種濾波方法實現影象平滑,線性濾波包括方框、均值、高斯。非線性濾波有:中值、雙邊濾波。

實現程式碼參考博主@IT1995 https://blog.csdn.net/qq78442761/article/details/54297212

線性濾波:畫素的輸出值取決於輸入畫素的加權求和

線性濾波其原始資料與濾波結果是一種算術運算,即用加減乘除等運算實現,如均值濾波(模板內畫素灰度值的平均值)、高斯濾波(高斯加權平均值)等。由於線性濾波是算術運算,有固定的模板。

非線性濾波:其運算元中包含了非線性運算元
非線性濾波的原始資料與濾波結果是一種邏輯關係,即用邏輯運算實現,如最大值濾波器、最小值濾波器、中值濾波器等,是通過比較一定鄰域內的灰度值大小來實現的,沒有固定的模板。

濾波和模糊、銳化的區別

以高斯濾波為例,

高斯濾波是指用高斯函式作為濾波函式的濾波操作。高斯模糊就是高斯低通濾波。高斯銳化就是高斯高通濾波。

卷積:左邊影象與中間影象卷積產生右邊影象

圖片源於:https://summitgao.github.io/new/opencv/lesson5.html

其中表示輸入畫素值,h表示加權系統"核"g表示輸出畫素。

函式原型分析及對應實現

//方框濾波

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

boxFilter(srcImage,dstImage1,-1,Size(nBoxFilterValue + 1,nBoxFilterValue + 1));

int型別的ddepth,輸出影象的深度,-1表示使用原圖深度,即src.depth()

Size型別的ksize ,表示核心大小,一般寫成Size(w,h),例如Size(3,3)表示3x3的核大小

//均值濾波 

輸出影象的每一個畫素是核視窗內輸入影象對應畫素的畫素的平均值( 所有畫素加權係數相等)。主要方法為鄰域平均法,例如中心畫素,周圍8鄰域為其模板(核心),鄰域畫素平均值作為中間畫素值

vid blur( InputArray src, OutputArray dst,
                        Size ksize, Point anchor=Point(-1,-1),
                        int borderType=BORDER_DEFAULT );

//高斯濾波  

廣泛應用於影象處理的減噪過程,每一個畫素點的值,都由其本身和鄰域內的其他畫素值經過加權平均後得到。可參考博主@ MingChaoSun http://blog.csdn.net/sunmc1204953974/article/details/50634652

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 );

與均值濾波對比發現,具體過程類似,一個取鄰域均值(去掉目標畫素本身),一個取鄰域中值(包括目標畫素本身)

中值濾波優勢: 消除噪聲以及儲存邊緣

均值濾波優勢:耗時只需中值濾波的1/5。

//雙邊濾波

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

int型別的d,表示在過濾過程中每個畫素鄰域的直徑

 nBilateralFilterValue=50;

bilateralFilter(srcImage,dstImage5,nBilateralFilterValue,nBilateralFilterValue*2,nBilateralFilterValue/2);