【OpenCV3】平滑处理详解
“平滑”通常又稱“模糊”,是一種簡單常用的圖像處理操作。進(jìn)行平滑處理的原因有很多,但通常是用來去除噪聲和相機(jī)失真,平滑在按照一定的原理來降低圖像分辨率中也有重要應(yīng)用。
OpenCV2和OpenCV3中提供了5種不同的平滑處理方法,每一種都有自己相關(guān)的庫函數(shù),每一個(gè)庫函數(shù)實(shí)現(xiàn)的平滑都略有不同。在所有的平滑操作函數(shù)中,src和dst兩個(gè)參數(shù)都分別代表源圖像和目標(biāo)圖像。除此之外,每一種平滑操作都具有特定的相關(guān)操作參數(shù)。其中,唯一的共同參數(shù)是最后的borderType,這個(gè)參數(shù)表示平滑操作的過程中如何處理圖像的邊緣的像素。
下面將分別對這5中平滑操作函數(shù)進(jìn)行介紹。
1、cv::blur()
void cv::blur(cv::InputArray src, // 輸入圖像cv::OutputArray dst, // 輸出圖像cv::Size ksize, // 核大小cv::Point anchor = cv::Point(-1,-1), // 錨點(diǎn)位置int borderType = cv::BORDER_DEFAULT // 邊界處理方法 );
cv::blur()又被稱作“簡單平滑”操作,輸出圖像中的每個(gè)像素值,為窗口中(如核)所有像素的簡單平均值,窗口的大小通過ksize參數(shù)指定。參數(shù)anchor可以用來指定內(nèi)核是如何與被計(jì)算的像素對齊的。默認(rèn)情況下,anchor的取值為cv::Point(-1,-1),這意味著,核相對于濾波器居中。在多通道圖像中,每個(gè)通道需要分別計(jì)算。
cv::blur()實(shí)際上是下面要介紹的cv::boxFilter()的一個(gè)特例,實(shí)際平滑效果如下。
2、cv::boxFilter()
void cv::boxFilter(cv::InputArray src, // 輸入圖像cv::OutputArray dst, // 輸出圖像int ddepth, // 位深(如 CV_8U)cv::Size ksize, // 核大小cv::Point anchor = cv::Point(-1,-1), // 錨點(diǎn)位置bool normalize = true, // 如果是 true, 用box area進(jìn)行劃分int borderType = cv::BORDER_DEFAULT // 邊界處理方法 );
cv::boxFilter()相對于cv::blur()來說更為通用,后者是前者的一種特殊形式。所謂"盒形濾波器"即為,任意一個(gè)矩形形狀濾波器,其中所有的均相等,通常情況下?= 1,或者?= 1/A,其中A為濾波器的面積,如下圖所示。
二者間的主要區(qū)別在于,cv::boxFilter()可以在非歸一化模式(normalize = false)下運(yùn)行,且輸出圖像的位深可以控制(在cv::blur中,dst的位深始終和src保持一致)。如果ddepth的值設(shè)為-1,則輸出圖像和輸入圖像的位深一致;否則,你可以選擇常用的任何位深(如CV_32F)。平滑效果如下:
3、cv::medianBlur()
void cv::medianBlur(cv::InputArray src, // 輸入圖像cv::OutputArray dst, // 輸出圖像cv::Size ksize // 核大小 );
cv::medianBlur()即通常所說的均值濾波,其主要思想是,用中心像素矩形鄰域內(nèi)的中值來替代中心像素。平滑效果如下:
4、cv::GaussianBlur()
void cv::GaussianBlur(cv::InputArray src, // 輸入圖像cv::OutputArray dst, // 輸出圖像cv::Size ksize, // 核大小double sigmaX, // x方向高斯半寬double sigmaY = 0.0, // y方向高斯半寬int borderType = cv::BORDER_DEFAULT // 邊界處理方法 );
cv::GaussianBlur()即高斯濾波,是最常用的一種濾波方式。其主要思想是,使用高斯核與輸入圖像中的每個(gè)點(diǎn)作卷積運(yùn)算,然后對卷積結(jié)果進(jìn)行求和,從而得到輸出圖像。
對于cv::GaussianBlur()而言,參數(shù)ksize用于指定濾波窗口的寬和高;sigmaX為高斯核在x方向上的sigma值;sigmaY為高斯核在y方向上的sigma值;如果你只指定x的值,而將y的值設(shè)為0,則y的值將被認(rèn)為和x相同。如果二者均被指定為0,則高斯參數(shù)則自動使用下式進(jìn)行計(jì)算:
下圖是ksize = (5,3), sigmaX = 1, and sigmaY = 0.5的高斯核示例:
平滑效果如下:
5、cv::bilateralFilter()
void cv::bilateralFilter(cv::InputArray src, // 輸入圖像cv::OutputArray dst, // 輸出圖像int d, // 像素臨接大小(最大距離)double sigmaColor, // 顏色權(quán)重函數(shù)寬度參數(shù)double sigmaSpace, // 空間權(quán)重函數(shù)寬度參數(shù)int borderType = cv::BORDER_DEFAULT // 邊界處理方法 );
cv::bilateralFilter(),即雙邊濾波,是一種可以保持圖像邊緣的平滑方法。和高斯濾波類似,雙邊濾波也是通過計(jì)算中像素和鄰域像素的加權(quán)平均所實(shí)現(xiàn)的,只是其權(quán)值由兩部分組成。其中,第一部分和高斯平滑的權(quán)值相同;第二部分也是高斯權(quán)值,但是該權(quán)值并不是基于中心像素的空間距離,而是基于和中心像素點(diǎn)的灰度值的差異。
雙邊濾波函數(shù)有3個(gè)主要參數(shù)(不包括輸入和輸出):第一個(gè)參數(shù)d是濾波過程中的像素鄰域直徑;第二個(gè)參數(shù)是用于顏色域高斯核的參數(shù),稱作sigmaColor,和高斯濾波中的sigma參數(shù)類似;第三個(gè)參數(shù)是空間域中的高斯核寬度,稱作sigmaSpace。平滑效果如下:
2017.03.29
總結(jié)
以上是生活随笔為你收集整理的【OpenCV3】平滑处理详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【OpenCV3】阈值化操作——cv::
- 下一篇: 【OpenCV3】OpenCV3.2.0