1. 程式人生 > >OpenCV學習筆記【七】方框濾波、均值濾波、高斯濾波

OpenCV學習筆記【七】方框濾波、均值濾波、高斯濾波

1.平滑處理

平滑處理(smoothing)也稱模糊處理(bluring),是一種簡單且使用頻率很高的影象處理方法。平滑處理的用途有很多,最常見的是用來減少影象上的噪點或者失真。在涉及到影象解析度時,平滑處理是非常好用的方法。

2.影象濾波與濾波器

影象濾波,指儘量保留影象細節特徵的條件下對目標影象的噪聲進行抑制,是影象預處理中不可缺少的操作,其處理效果好壞將直接影響到後續影象處理和分析的有效性和可靠性。消除影象中的噪聲成分叫做影象的平滑化或濾波操作。訊號或影象的能量大部分集中在幅度譜的低頻和中頻段,而在較高頻段,有用的資訊經常被噪聲淹沒。因此一個能降低高頻成分幅度的濾波器就能夠減弱噪聲的影響。而對濾波處理的要求也有兩條:一是不能損壞影象的輪廓及邊緣等重要資訊;二是使影象清晰視覺效果好。平滑濾波是低頻增強的空間域濾波技術。它的目的有兩類:一是模糊;另一類是消除噪音。

空間域的平滑濾波一般採用簡單平均法進行,就是求鄰近像元點的平均亮度值。領域的大小與平滑的效果直接相關,鄰域越大平滑的效果越好,但鄰域過大,平滑也會使邊緣資訊損失的越大,從而使輸出的影象變得模糊,因此需合理選擇鄰域的大小。關於濾波器,一種形象的比喻是:可以把濾波器想象成一個包含加權係數的視窗,當使用這個濾波器平滑處理影象時,就把這個視窗放到影象上,透過這個視窗來看到我們得到的影象。

線性濾波器:線性濾波器經常用於剔除輸入訊號不想要的頻率或者從許多頻率中選擇一個想要的頻率。

低通濾波器:允許低頻率通過;

高通濾波器:允許一定高頻率通過;

帶通濾波器:阻止一定範圍頻率通過並且允許其他頻率通過;

全通濾波器:允許所有頻率通過,僅僅改變相位關係;

陷波濾波器:阻止一個狹窄頻率通過,是一種特殊帶阻濾波器。

3.領域運算元

領域運算元(區域性運算元)是利用給定畫素周圍的畫素值的決定此畫素的最終輸出值的一種運算元。而線性領域濾波就是一種常用的領域運算元,畫素的輸出值取決於輸入畫素的加權和。領域運算元除了用於區域性色調調整以外,還可以用於影象濾波,以實現影象的平滑和銳化,影象邊緣增強或者影象噪聲的去除。在OpenCV中提供了三種濾波方式:方框濾波、均值濾波、高斯濾波。

一、方框濾波

#include "opencv2/core/core.hpp" 
#include "opencv2/highgui/highgui.hpp" 
#include "opencv2/imgproc/imgproc.hpp" 
using namespace cv; 

int main( )
{ 
	// 載入原圖
	Mat image = imread("1.jpg"); 

	//建立視窗
	namedWindow( "方框濾波【原圖】" ); 
	namedWindow( "方框濾波【效果圖】"); 

	//顯示原圖
	imshow( "方框濾波【原圖】", image ); 

	//進行方框濾波操作
	Mat out; 
	boxFilter( image, out, -1,Size(5, 5)); 
	//顯示效果圖
	imshow( "方框濾波【效果圖】" ,out ); 
	waitKey( 0 );     
} 

程式中直接呼叫了OpenCV的濾波函式,效果如下圖:

二、均值濾波

#include "opencv2/highgui/highgui.hpp" 
#include "opencv2/imgproc/imgproc.hpp" 
using namespace cv; 
int main( )
{ 
	//【1】載入原始圖
	Mat srcImage=imread("1.jpg"); 

	//【2】顯示原始圖
	imshow( "均值濾波【原圖】", srcImage ); 

	//【3】進行均值濾波操作
	Mat dstImage; 
	blur( srcImage, dstImage, Size(7, 7)); 

	//【4】顯示效果圖
	imshow( "均值濾波【效果圖】" ,dstImage ); 

	waitKey( 0 );     
} 

三、高斯濾波

#include "opencv2/core/core.hpp" 
#include "opencv2/highgui/highgui.hpp" 
#include "opencv2/imgproc/imgproc.hpp" 
using namespace cv;
int main( )
{ 
	// 載入原圖
	Mat image=imread("1.jpg"); 

	//建立視窗
	namedWindow( "高斯濾波【原圖】" ); 
	namedWindow( "高斯濾波【效果圖】"); 

	//顯示原圖
	imshow( "高斯濾波【原圖】", image ); 

	//進行高斯濾波操作
	Mat out; 
	GaussianBlur( image, out, Size( 5, 5 ), 0, 0 ); 

	//顯示效果圖
	imshow( "高斯濾波【效果圖】" ,out ); 

	waitKey( 0 );     
} 

四、三種濾波方式混合

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main(   )
{
	//改變console字型顏色
	system("color 5F"); 
	//輸出幫助文字
	// 載入原圖
	g_srcImage = imread( "1.jpg", 1 );
	if( !g_srcImage.data ) { printf("Oh,no,讀取srcImage錯誤~! \n"); return false; }
	//克隆原圖到三個Mat型別中
	g_dstImage1 = g_srcImage.clone( );
	g_dstImage2 = g_srcImage.clone( );
	g_dstImage3 = g_srcImage.clone( );
	//顯示原圖
	namedWindow("【<0>原圖視窗】", 1);
	imshow("【<0>原圖視窗】",g_srcImage);
	//=================【<1>方框濾波】==================
	//建立視窗
	namedWindow("【<1>方框濾波】", 1);
	//建立軌跡條
	createTrackbar("核心值:", "【<1>方框濾波】",&g_nBoxFilterValue, 40,on_BoxFilter );
	on_MeanBlur(g_nBoxFilterValue,0);
	imshow("【<1>方框濾波】", g_dstImage1);
	//================================================
	//=================【<2>均值濾波】==================
	//建立視窗
	namedWindow("【<2>均值濾波】", 1);
	//建立軌跡條
	createTrackbar("核心值:", "【<2>均值濾波】",&g_nMeanBlurValue, 40,on_MeanBlur );
	on_MeanBlur(g_nMeanBlurValue,0);
	//================================================

	//=================【<3>高斯濾波】=====================
	//建立視窗
	namedWindow("【<3>高斯濾波】", 1);
	//建立軌跡條
	createTrackbar("核心值:", "【<3>高斯濾波】",&g_nGaussianBlurValue, 40,on_GaussianBlur );
	on_GaussianBlur(g_nGaussianBlurValue,0);
	//================================================
	//輸出一些幫助資訊
	cout<<endl<<"\t執行成功,請調整滾動條觀察影象效果~\n\n"
		<<"\t按下“q”鍵時,程式退出。\n";

	//按下“q”鍵時,程式退出
	while(char(waitKey(1)) != 'q') {}

	return 0;
}
//-----------------------------【on_BoxFilter( )函式】------------------------------------
//	描述:方框濾波操作的回撥函式
//-----------------------------------------------------------------------------------------------
static void on_BoxFilter(int, void *)
{
	//方框濾波操作
	boxFilter( g_srcImage, g_dstImage1, -1,Size( g_nBoxFilterValue+1, g_nBoxFilterValue+1));
	//顯示視窗
	imshow("【<1>方框濾波】", g_dstImage1);
}
//-----------------------------【on_MeanBlur( )函式】------------------------------------
//	描述:均值濾波操作的回撥函式
//-----------------------------------------------------------------------------------------------
static void on_MeanBlur(int, void *)
{
	//均值濾波操作
	blur( g_srcImage, g_dstImage2, Size( g_nMeanBlurValue+1, g_nMeanBlurValue+1), Point(-1,-1));
	//顯示視窗
	imshow("【<2>均值濾波】", g_dstImage2);
}
//-----------------------------【ContrastAndBright( )函式】------------------------------------
//	描述:高斯濾波操作的回撥函式
//-----------------------------------------------------------------------------------------------
static void on_GaussianBlur(int, void *)
{
	//高斯濾波操作
	GaussianBlur( g_srcImage, g_dstImage3, Size( g_nGaussianBlurValue*2+1, g_nGaussianBlurValue*2+1 ), 0, 0);
	//顯示視窗
	imshow("【<3>高斯濾波】", g_dstImage3);
}