1. 程式人生 > >學習c++版opencv3.4之9-模糊影象

學習c++版opencv3.4之9-模糊影象

影象模糊:為了降低影象噪聲。

常見的為Smooth, blur,它們利用卷積計算實現,這些卷積運算元都是線性操作,所以又稱為線性濾波。

均值濾波核的權重都為1,最終畫素取個結果和的均值,最終導致影象各個區域的畫素值比較均勻,無法克服邊緣畫素資訊丟失。

高斯濾波核的權重是一個高斯分佈的值,濾波後較大的畫素值仍然較大,因此影象會保留原有的特點,但只是部分地克服了邊緣資訊的丟失,無法完全避免,因為沒有考慮畫素值的不同。

均值濾波(模糊):blur(src, dst, Size(5, 5));

高斯濾波(模糊):GaussianBlur(src, dst2, Size(5, 5), 11);

#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>

using namespace std;
using namespace cv;

int main(){
    Mat src, dst;
    src = imread("/Users/ming/Documents/test.jpg");
    if (!src.data){
        printf("cannot load image ...");
        return -1;
    }
    namedWindow("src img", CV_WINDOW_AUTOSIZE);
    imshow("src img", src);
    
    blur(src, dst, Size(5, 5));  //均值模糊
    namedWindow("blur img", CV_WINDOW_AUTOSIZE);
    imshow("blur img", dst);
    
    Mat dst2;
    GaussianBlur(src, dst2, Size(5, 5), 11); //高斯模糊
    namedWindow("gaussianblur img", CV_WINDOW_AUTOSIZE);
    imshow("gaussianblur img", dst2);
    
    waitKey(0);
    return 0;
}

中值濾波(模糊):是一種統計排序濾波器,因為在核對應的範圍中,給中心點賦予核範圍內中間數值,對椒鹽噪點有很好點抑制作用。函式:medianBlur(src, dst, 5); //5為卷積核的大小

高斯雙邊濾波(模糊):是邊緣保留的濾波方法,避免邊緣畫素資訊丟失,保留了影象輪廓不變。可以用於美顏中。

bilateralFilter

#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>

using namespace std;
using namespace cv;

int main(){
    Mat src, dst;
    src = imread("/Users/ming/Documents/test.jpg");
    if (!src.data){
        printf("cannot load image ...");
        return -1;
    }
    namedWindow("src img", CV_WINDOW_AUTOSIZE);
    imshow("src img", src);
    
    medianBlur(src, dst, 5); //中值濾波
    imshow("medianblur", dst);
    
    Mat dst1;
    GaussianBlur(src, dst1, Size(5,5), 11); //高斯濾波
    imshow("gaussianblur", dst1);
    
    Mat dst2;
    bilateralFilter(src, dst2, 15, 150, 10); //高斯雙邊濾波。15表示計算區域的半徑,150表示畫素差值在150內才進行計算
    imshow("bilateralFilter", dst2);
    
    Mat dst2_1;
    Mat kernel = (Mat_<int>(3,3) << 0,-1,0,-1,5,-1,0,-1,0);
    filter2D(dst2, dst2_1, -1, kernel); //提高對比度
    imshow("bilateralFilter + filter2D", dst2_1);
    
    waitKey(0);
    return 0;
}