OpenCV-濾波算子(一)
author@jason_ql
http://blog.csdn.net/lql0716
平滑處理(smoothing)也稱模糊處理(bluring),常用來減少圖像上的噪點或者失真。
1、線性濾波:
1.1 方框濾波:BoxBlur()
方框濾波一般用來模糊一張圖片。
C++:void bosFilter(InputArray src, OutputArray dst, int ddepth, Size ksize, Point anchor=Point(-1,-1), boolnormalize=true, int borderType=BORDER_DEFAULT)
參數:
第一個參數
:InputArray類型的src,輸入圖像,即原圖像,填Mat類的對象即可。該函數對通道是獨立處理的,且可以處理任意通道數的圖片。但需注意,待處理的圖片深度應該是CV_8U、CV_16U、CV_16S、CV_32F、CV_64F之一。
第二個參數
:OutputArray類型的dst,即目標圖像,需要和原圖片有一樣的尺寸和類型。
第三個參數
:int類型的ddepth,輸出圖像的深度。“-1”代表使用原圖深度,即src.depth()。
第四個參數
:Size類型的ksize,內核的大小。一般用Size(w,h)的寫法來表示內核的大小(其中,w爲像素寬度,h爲像素高度)。例如Size(3,3)表示3x3的核大小;Size(5,5)表示5x5的核大小。
第五個參數
:Point類型的anchor,表示錨點(即被平滑的那個點),注意,它有默認值Point(-1,-1)。如果這個點座標是負值的話,就表示取核的中心爲錨點,所以默認值Point(-1,-1)表示這個錨點在覈的中心。
第六個參數
:bool類型的normalize,默認值爲true,一個標識符,表示內核是否被其區域歸一化(normalized)了。
第七個參數
:int類型的borderType,用於推斷圖像外部像素的某種邊界模式。有默認值BORDER_DEFAULT,我們一般不去管它。
1.2 均值濾波:Blur()
C++: void blur(InputArray src, OutputArray dst, Size ksize, Point anchor=Point(-1,-1), int borderType=BORDER_DEFAULT)
第一個參數
:InputArray類型的src,輸入圖像,即原圖像,填Mat類的對象即可。該函數對通道是獨立處理的,且可以處理任意通道數的圖片。但需注意,待處理的圖片深度應該是CV_8U、CV_16U、CV_16S、CV_32F、CV_64F之一。
第二個參數
:OutputArray類型的dst,即目標圖像,需要和原圖片有一樣的尺寸和類型。
第三個參數
:Size類型的ksize,內核的大小。一般用Size(w,h)的寫法來表示內核的大小(其中,w爲像素寬度,h爲像素高度)。例如Size(3,3)表示3x3的核大小;Size(5,5)表示5x5的核大小。
第四個參數
:Point類型的anchor,表示錨點(即被平滑的那個點),注意,它有默認值Point(-1,-1)。如果這個點座標是負值的話,就表示取核的中心爲錨點,所以默認值Point(-1,-1)表示這個錨點在覈的中心。
第五個參數
:int類型的borderType,用於推斷圖像外部像素的某種邊界模式。有默認值BORDER_DEFAULT,我們一般不去管它。
1.3 高斯濾波:GaussianBlur()
高斯濾波一般用來模糊一張圖片。
C++: void GaussianBlur(InputArray src, OutputArray dst, Size ksize, double sigmaX, double sigmaY=0, int borderType=BORDER_DEFAULT)
第一個參數
:InputArray類型的src,輸入圖像,即原圖像,填Mat類的對象即可。該函數對通道是獨立處理的,且可以處理任意通道數的圖片。但需注意,待處理的圖片深度應該是CV_8U、CV_16U、CV_16S、CV_32F、CV_64F之一。
第二個參數
:OutputArray類型的dst,即目標圖像,需要和原圖片有一樣的尺寸和類型。
第三個參數
:Size類型的ksize,內核的大小。一般用Size(w,h)的寫法來表示內核的大小(其中,w爲像素寬度,h爲像素高度)。例如Size(3,3)表示3x3的核大小;Size(5,5)表示5x5的核大小。
第四個參數
:double類型的sigmaX,表示高斯函數在X方向的標準偏差。
第五個參數
:double類型的sigmaY,表示高斯核函數在Y方向的標準差。若sigmaY爲零,就將它設爲sigmaX,如果sigmaX和sigmaY都是0,那麼久有ksize.width和ksize.height計算出來。爲了結果的正確性着想,最好把第三個參數Size、第四個參數sigmaX和第五個參數sigmaY全部指定到。
第六個參數
:int類型的borderType,用於推斷圖像外部像素的某種邊界模式。有默認值BORDER_DEFAULT,我們一般不去管它。
2、非線性濾波:
2.1 中值濾波:medianBlur()
中值濾波一般用來平滑(模糊)處理一張圖片。
C++: void medianBlur(InputArray src, OutputArray dst, int ksize)
第一個參數
:InputArray類型的src,函數的輸入參數,填1、3或4通道的Mat類型的圖像。當ksize爲3或5的時候,圖像深度需爲CV_8U、CV_16U、CV_32F其中之一,而對於較大孔徑尺寸的圖片,它只能是CV_8U。
第二個參數
:OutputArray類型的dst,即目標圖像,函數的輸出參數,需要和原圖像有一樣的尺寸和類型。我們可以用Mat::Clone,以原圖片爲模板,來初始化得到如假包換的目標圖。
第三個參數
:int類型的ksize,孔徑的線性尺寸(aperture linear size),注意這個參數必須是大於1的奇數,比如3、5、7、9……
2.2 雙邊濾波:bilateralFilter()
雙邊濾波一般用來模糊處理一張圖片。
C++: void bilateralFilter(InputArray src, OutputArray dst, int d, double sigmaColor, double sigmaSpace, int borderType=BORDER_DEFAULT)
第一個參數
:InputArray類型的src,輸入圖像,即原圖像,需要爲8爲或浮點型單通道、三通道的圖像。
第二個參數
:OutputArray類型的dst,即目標圖像,需要和原圖片有一樣的尺寸和類型。
第三個參數
:int類型的d,表示在過濾過程中每個像素鄰域的直徑。如果這個值被設爲非正數,那麼Opencv會從第五個參數sigmaSpace來計算出它。
第四個參數
:double類型的sigmaColor,顏色空間濾波器的sigma值。這個參數的值越大,就表明該像素鄰域內越寬廣的顏色會被混合到一起,產生較大的半相等顏色區域。
第五個參數
:double類型的sigmaSpace,座標空間中值濾波器的sigma值,座標空間的標準方差。它的數值越大,意味着越遠的像素會相互影響,從而使更大的區域中足夠相似的顏色獲取相同的顏色。當
第六個參數
:int類型的borderType,用於推斷圖像外部像素的某種邊界模式。注意它有默認值BORDER_DEFAULT。
3、方框、均值、高斯、中值、雙邊濾波代碼示例
#include <opencv2\opencv.hpp>
//#include <opencv2\core\core.hpp>
//#include <opencv2\highgui\highgui.hpp>
//#include <opencv2\imgproc\imgproc.hpp>
using namespace cv;
using namespace std;
string path = "D:/test/source/img/031.jpg";
cv::Mat img = cv::imread(path);
cv::Mat dst, dst2, dst3, dst4, dst5;
int main()
{
cv::namedWindow("原圖");
cv::imshow("原圖", img);
//方框濾波
cv::namedWindow("方框濾波——效果圖");
cv::boxFilter(img, dst, -1, cv::Size(5, 5));
cv::imshow("方框濾波——效果圖", dst);
//均值濾波
cv::namedWindow("均值濾波——效果圖");
cv::blur(img, dst2, cv::Size(7, 7));
cv::imshow("均值濾波——效果圖", dst2);
//高斯濾波
cv::namedWindow("高斯濾波——效果圖");
cv::GaussianBlur(img, dst3, cv::Size(7, 7), 0, 0);
cv::imshow("高斯濾波——效果圖", dst3);
//中值濾波
cv::namedWindow("中值濾波——效果圖");
cv::medianBlur(img, dst4, 7);
cv::imshow("中值濾波——效果圖", dst4);
//雙邊濾波
cv::namedWindow("雙邊濾波——效果圖");
cv::bilateralFilter(img, dst5, 25, 25 * 2, 25 / 2);
cv::imshow("雙邊濾波——效果圖", dst5);
cv::waitKey(0);
return 0;
}