1. 程式人生 > >【opencv學習之二十四】OpenCV濾波處理對比

【opencv學習之二十四】OpenCV濾波處理對比

OpenCV的鄰域濾波處理函式主要都通影象的卷積操作,有

1方框濾波boxFilter(),屬於線性濾波,其原理是用一個矩陣和一個核矩陣卷積操作;

2均值濾波blur(),也屬於線性濾波,是方框濾波一種歸一化後的方框濾波;

3高斯濾波GaussianBlur(),屬於線性濾波,其原理類似均值濾波,但是濾波經過加權處理,加權值符合正態分佈,處理效果比均值更好一些;

4中值濾波medianBlur(),屬於非線性濾波,會考慮區域範圍內極端值的情況,然後再通過演算法濾波;以下為摘自別的部落格:中值濾波選擇每個鄰域畫素的中值輸出;指去掉百分率為a的最小值和最大值;定義域濾波中沿著邊界的數字是畫素的距離;值域就是去掉值域外的畫素值。

5雙邊濾波bilateraFilter(),雙邊濾波的思想是抑制與中心畫素值差別太大的畫素,輸出畫素值依賴於鄰域畫素值的加權合;

濾波通俗來講主要目的是為了消除影象上的干擾雜質,或者說去除小點;上面幾種濾波的原理和演算法可以參考小魏的部落格:http://blog.csdn.net/xiaowei_cqu/article/details/7785365;深入瞭解;

濾波程式碼示例:

void imgSmoothing()//濾波操作
{
    Mat srcImg = imread("D:/ImageTest/0tu5px.JPG");
    Mat dstImg1,dstImg2,dstImg3,dstImg4,dstImg5 ;
    cv::cvtColor(srcImg,srcImg,COLOR_RGB2GRAY);//進行,灰度處理
    Size size0 = Size(5, 5);
    boxFilter(srcImg, dstImg1, -1, Size(3, 3), Point(-1, -1), true);  //方框濾波器 bool normalize引數設定為true時等同於均值濾波
    blur(srcImg, dstImg2, size0);  //均值濾波
    GaussianBlur(srcImg, dstImg3, Size(3, 3), 1);//高斯濾波
    medianBlur(srcImg, dstImg4, 5);//中值濾波
    bilateralFilter(srcImg, dstImg5, 5, 10.0, 2.0);//雙邊濾波
    threshold(dstImg1,dstImg1, 127, 255, THRESH_BINARY);
    threshold(dstImg2,dstImg2, 127, 255, THRESH_BINARY);
    threshold(dstImg3,dstImg3, 127, 255, THRESH_BINARY);
    threshold(dstImg4,dstImg4, 127, 255, THRESH_BINARY);
    threshold(dstImg5,dstImg5, 127, 255, THRESH_BINARY);
    imshow("src", srcImg);
    imshow("boxFilter dst", dstImg1);
    //    imwrite("D:/boxFilter.jpg", dstImg1); //儲存結果圖片
    imshow("blur dst", dstImg2);
    //     imwrite("D:/blur.jpg", dstImg2); //儲存結果圖片
    imshow("GaussianBlur dst", dstImg3);
    imshow("medianBlur dst", dstImg4);
    imshow(" bilateralFilter dst", dstImg5);
    waitKey(0);
}
實驗結果: