【OpenCV】5种图像滤波辨析:方框、均值、高斯、中值、双边
from:http://www.07net01.com/2015/12/1003192.html
圖像濾波
什么是圖像濾波
圖像濾波,即在盡量保留圖像細(xì)節(jié)特征的條件下對(duì)目標(biāo)圖像的噪聲進(jìn)行抑制,是圖像預(yù)處理中不可缺少的操作,其處理效果的好壞將直接影響到后續(xù)圖像處理和分析的有效性和可靠性。(摘自網(wǎng)絡(luò))
圖像濾波的目的
1,消除圖像中混入的噪聲?
2,為圖像識(shí)別抽取出圖像特征
圖像濾波的要求
1,不能損壞圖像輪廓及邊緣?
2,圖像視覺(jué)效果應(yīng)當(dāng)更好
濾波器的定義
濾波器,顧名思義,是對(duì)波進(jìn)行過(guò)濾的器件。(摘自網(wǎng)絡(luò))?
以上的定義是針對(duì)物理器件的,但對(duì)于圖像濾波而言顯然也是適用的。
大家都用過(guò)放大鏡,這里就以此舉一個(gè)例子:你將放大鏡移動(dòng)的過(guò)程中可以看到放大的物體,濾波器就是一個(gè)承載著加權(quán)系數(shù)的鏡片,這里就是透過(guò)鏡片可以看到經(jīng)過(guò)平滑處理過(guò)的圖像,透過(guò)鏡片以及伴隨著鏡片的移動(dòng)你可以逐漸所有的圖像部分。
濾波器的種類
3種線性濾波:方框?yàn)V波、均值濾波、高斯濾波?
2種非線性濾波:中值濾波、雙邊濾波
方框?yàn)V波
方框?yàn)V波所用到的核:
當(dāng)normalize為true時(shí),方框?yàn)V波也就成了均值濾波。也就是說(shuō)均值濾波是方框?yàn)V波歸一化后的特殊情況。
歸一化就是將要處理的量縮放到一定范圍,比如(0,1)。
(函數(shù)解析均在后文中統(tǒng)一提供)
均值濾波
如上所說(shuō),均值濾波就是normalize為true的情況,此時(shí)就是在平均值。均值濾波在去噪的同時(shí)破壞了圖像的細(xì)節(jié)部分,也使得圖像變得更加模糊。
高斯濾波
高斯濾波則不同,其能夠很好的消除噪聲。高斯濾波過(guò)程中,每個(gè)像素點(diǎn)都是由本身和鄰域內(nèi)的其他像素值經(jīng)過(guò)加權(quán)平均后得到的。
從數(shù)學(xué)的角度來(lái)看,圖像的高斯模糊過(guò)程就是圖像與正態(tài)分布做卷積,由于正態(tài)分布也被稱為高斯分布,因此這項(xiàng)技術(shù)被稱為高斯模糊。
由于高斯函數(shù)的傅里葉變換是另外一個(gè)高斯函數(shù),所以高斯模糊對(duì)圖像來(lái)說(shuō)就是一個(gè)低通濾波器。
N維空間正態(tài)分布方程和二維空間正態(tài)分布分別為:
中值濾波
中值濾波的基本思想是用像素點(diǎn)鄰域灰度值的中值來(lái)代替該像素的灰度值,該方法在去除脈沖噪聲、椒鹽噪聲的同時(shí)還能保留圖像的細(xì)節(jié)部分。
中值濾波花費(fèi)的時(shí)間比均值濾波更久,但其在噪聲的消除能力上更強(qiáng)。
雙邊濾波
雙邊濾波是結(jié)合圖像的空間鄰近度和像素值相似度的一種折中處理,同時(shí)考慮空域信息和灰度相似性,達(dá)到保留邊緣且去除噪聲的目的。
函數(shù)原型
方框?yàn)V波
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)具體參數(shù)解析
InputArray src:輸入圖像(源圖像),Mat類型對(duì)象,圖像深度應(yīng)該是CV_8U、CV_16U、CV_16S、CV_32F、CV_64F之一。而對(duì)于中值濾波而言,如果ksize為3或者5時(shí),圖像深度必須是CV_8U、CV_16U、CV_32F之一,如果孔徑較大,則只能是CV_8U。 OutputArray dst:輸出圖像(目標(biāo)圖像),和源圖像的尺寸和類型均一樣。 int ddepth:輸出圖像的深度,-1表示原圖像深度(即src.depth())。 Size ksize:內(nèi)核大小,用Size(w,h)來(lái)表示,w和h分別表示寬和高。 Point anchor:錨點(diǎn),也就是被平滑的點(diǎn),如果該點(diǎn)坐標(biāo)為負(fù)值表示取核的中心,因此默認(rèn)的(-1,-1)就表示錨點(diǎn)在核中心。 bool normalize:標(biāo)識(shí)符,為true時(shí)表示內(nèi)核被其余區(qū)域歸一化(normalized)了。 int borderType:推斷圖像外部像素的某種邊界模式。 double sigmaX:表示高斯核函數(shù)在X方向的標(biāo)準(zhǔn)偏差。 double sigmaY:表示高斯核函數(shù)在Y方向的標(biāo)準(zhǔn)偏差。當(dāng)sigmaY為0時(shí),就將其設(shè)為sigmaX;如果兩者均為0,則由ksize.with和ksize.height計(jì)算出來(lái),因此在高斯濾波函數(shù)中,ksize的w和h均必須是正數(shù)和奇數(shù),或0,兩者可以不同。 int ksize:孔徑的線性空間,必須是大于1的奇數(shù)。 int d:過(guò)濾過(guò)程中每個(gè)像素鄰域的直徑,如果其值為非正數(shù),則該值由sigmaSpace計(jì)算出來(lái)。 double sigmaColor:顏色空間濾波器的sigma值,這個(gè)參數(shù)的值越大,就表明該像素鄰域內(nèi)有越寬廣的顏色會(huì)被混合到一起,產(chǎn)生較大的半相等顏色區(qū)域。 double sigmaSpace:坐標(biāo)空間中濾波器的sigma值,坐標(biāo)空間的標(biāo)注方差。它的數(shù)值越大,意味著越遠(yuǎn)的像素會(huì)相互影響,從而使更大的區(qū)域中足夠相似的顏色獲取相同的顏色。當(dāng)d>0時(shí),d制定了鄰域大小與sigmaSpace無(wú)關(guān)。否則,d正比于sigmaSpace。示例
示例代碼
#include <iostream> #include <opencv2\core\core.hpp> #include <opencv2\highgui\highgui.hpp> #include <opencv2\imgproc\imgproc.hpp>using namespace std; using namespace cv;Mat g_srcImage; // 全局的源圖像 // 分別對(duì)應(yīng)全局的方框?yàn)V波、均值濾波、高斯濾波、中值濾波、雙邊濾波的輸出圖像以及內(nèi)核值/參數(shù)值 Mat g_dstImgBox, g_dstImgBlur, g_dstImgGaussian, g_dstImgMedian, g_dstImgBilateral; int g_BoxFilterVal = 5; int g_BlurVal = 12; int g_GaussianBlurVal = 5; int g_MedianBlurVal = 12; int g_BilateralFilterVal = 12;static void on_BoxFilter(int, void *); static void on_Blur(int, void *); static void on_GaussianBlur(int, void *); static void on_MedianBlur(int, void *); static void on_BilateralFilter(int, void*);int main() {// 讀取圖像到g_srcImageg_srcImage = imread("D:\\OpenCV\\ms2.png");if (!g_srcImage.data) {printf("讀取的圖片不存在…… \n");return false;}// 分別克隆原圖到5中濾波所需的圖像中,均為Mat類型g_dstImgBox = g_srcImage.clone();g_dstImgBlur = g_srcImage.clone();g_dstImgGaussian = g_srcImage.clone();g_dstImgMedian = g_srcImage.clone();g_dstImgBilateral = g_srcImage.clone();// 顯示原圖namedWindow("【原圖】", 1);imshow("【原圖】", g_srcImage);// 方框?yàn)V波namedWindow("【方框?yàn)V波】", 1);createTrackbar("內(nèi)核值", "【方框?yàn)V波】", &g_BoxFilterVal, 30, on_BoxFilter);on_BoxFilter(g_BoxFilterVal, 0);namedWindow("【均值濾波】", 1);createTrackbar("內(nèi)核值", "【均值濾波】", &g_BlurVal, 30, on_Blur);on_Blur(g_BlurVal, 0); namedWindow("【高斯濾波】", 1);createTrackbar("內(nèi)核值", "【高斯濾波】", &g_GaussianBlurVal, 30, on_GaussianBlur);on_GaussianBlur(g_GaussianBlurVal, 0); namedWindow("【中值濾波】", 1);createTrackbar("內(nèi)核值", "【中值濾波】", &g_MedianBlurVal, 30, on_MedianBlur);on_MedianBlur(g_MedianBlurVal, 0); namedWindow("【雙邊濾波】", 1);createTrackbar("內(nèi)核值", "【雙邊濾波】", &g_BilateralFilterVal, 30, on_BilateralFilter);on_BilateralFilter(g_BilateralFilterVal, 0); cout << "按下“q”鍵時(shí),程序退出……\n";while (char(waitKey(1)) != 'q') {} return 0; }static void on_BoxFilter(int, void *) {boxFilter(g_srcImage, g_dstImgBox, -1, Size(g_BoxFilterVal + 1, g_BoxFilterVal + 1));imshow("【方框?yàn)V波】", g_dstImgBox); }static void on_Blur(int, void *) {blur(g_srcImage, g_dstImgBlur, Size(g_BlurVal + 1, g_BlurVal + 1),Point(-1, -1));imshow("【均值濾波】", g_dstImgBlur); }static void on_GaussianBlur(int, void *) {GaussianBlur(g_srcImage, g_dstImgGaussian, Size(g_GaussianBlurVal * 2 + 1,g_GaussianBlurVal * 2 + 1), 0, 0);imshow("【高斯濾波】", g_dstImgGaussian); }static void on_MedianBlur(int, void *) {medianBlur(g_srcImage, g_dstImgMedian, g_MedianBlurVal * 2 + 1);imshow("【中值濾波】", g_dstImgMedian); }static void on_BilateralFilter(int, void*) {bilateralFilter(g_srcImage, g_dstImgBilateral, g_BilateralFilterVal,g_BilateralFilterVal * 2, g_BilateralFilterVal / 2);imshow("【雙邊濾波】", g_dstImgBilateral); }圖像示例
原圖
方框?yàn)V波
均值濾波
高斯濾波
中值濾波
雙邊濾波
總結(jié)
通過(guò)上面各個(gè)圖片的觀察:方框和均值還是比較相似的;高斯的話對(duì)于用Windows?7和Windows 10的朋友應(yīng)該都比較清楚了;中值看上去就是一種涂抹的感覺(jué);而雙邊的話則和原圖很接近了,我是沒(méi)看出來(lái)有什么區(qū)別的。
總結(jié)
以上是生活随笔為你收集整理的【OpenCV】5种图像滤波辨析:方框、均值、高斯、中值、双边的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 图像平滑处理(归一化块滤波、高斯滤波、中
- 下一篇: OpenCV2:图像滤波基础