天天看點

opencv學習(二十一)之中值濾波medianBlur

中值濾波是一種典型的非線性濾波,是基于排序統計理論的一種能夠有效抑制噪聲的非線性信号處理技術,基本思想是用像素點鄰域灰階值的中值來代替該像素點的灰階值,讓周圍的像素值接近真實的值進而消除孤立的噪聲點。該方法在取出脈沖噪聲、椒鹽噪聲的同時能保留圖像的邊緣細節。這些優良特性是線性濾波所不具備的。

中值濾波首先也得生成一個濾波模闆,将該模闆内的各像素值進行排序,生成單調上升或單調下降的二維資料序列,二維中值濾波輸出為g(x, y)=medf{f(x-k, y-1),(k, l∈w)},其中f(x,y)和g(x,y)分别是原圖像和處理後圖像, w為輸入的二維模闆,能夠在整幅圖像上滑動,通常尺寸為3*3或5*5區域,也可以是不同的形狀如線狀、圓形、十字形、圓環形等。通過從圖像中的二維模闆取出奇數個資料進行排序,用排序後的中值取代要處理的資料即可。

中值濾波對消除椒鹽噪聲非常有效,能夠克服線性濾波器帶來的圖像細節模糊等弊端,能夠有效保護圖像邊緣資訊,是非常經典的平滑噪聲處理方法。在光學測量條紋圖像的香味分析處理方法中有特殊作用,但在條紋中心分析方法中作用不大。

中值濾波相較于線性濾波中的均值濾波優點在前面已經提到,取得良好濾波效果的代價就是耗時的提升,可能達到均值濾波的數倍,而且對于細節較多的圖像也不太适用。

opencv中提供了medianBlur()函數實作了中值濾波操作,其原型如下:

C++: void medianBlur(InputArray src, OutputArray dst, int ksize)
           

參數解釋:

. InputArray src: 輸入圖像,圖像為1、3、4通道的圖像,當模闆尺寸為3或5時,圖像深度隻能為CV_8U、CV_16U、CV_32F中的一個,如而對于較大孔徑尺寸的圖檔,圖像深度隻能是CV_8U。

. OutputArray dst: 輸出圖像,尺寸和類型與輸入圖像一緻,可以使用Mat::Clone以原圖像為模闆來初始化輸出圖像dst

. int ksize: 濾波模闆的尺寸大小,必須是大于1的奇數,如3、5、7……

示例程式:

#include <iostream>
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>

using namespace std;
using namespace cv;

//定義全局變量
Mat g_mSrcImage;
Mat g_mDstImage;
const int g_nMedianBlurMaxValue = ;
int g_nMedianBlurValue;
int g_nkernelSize;

//定義回調函數
void on_medianBlurTrackBar(int, void*);

int main()
{
    g_mSrcImage = imread("lena.jpg");

    //判斷檔案是否加載成功
    if(g_mSrcImage.empty())
    {
        cout << "圖像加載失敗!" << endl;
        return -;
    }
    else
        cout << "圖像加載成功!" << endl;

    //判斷圖像是否是CV_8U圖像
    if( <= g_mSrcImage.depth() <= )
        cout << "加載圖像符合處理要求!" << endl;
    else
    {
        cout << "圖像深度不是CV_8U,程式即将退出..." << endl;
        return -;
    }

    namedWindow("原圖像", WINDOW_AUTOSIZE);
    imshow("原圖像", g_mSrcImage);

    //輸出圖像視窗屬性及軌迹條名稱
    namedWindow("中值濾波圖像", WINDOW_AUTOSIZE);
    char medianBlurName[];
    sprintf(medianBlurName, "核函數尺寸 %d", g_nMedianBlurMaxValue);
    g_nMedianBlurValue = ;

    //建立軌迹條
    createTrackbar(medianBlurName, "中值濾波圖像", &g_nMedianBlurValue,
                    g_nMedianBlurMaxValue, on_medianBlurTrackBar);
    on_medianBlurTrackBar(g_nMedianBlurValue, );

    waitKey();


    return ;
}

void on_medianBlurTrackBar(int, void*)
{
    //重新計算尺寸值,尺寸值應為大于1的奇數
    g_nkernelSize = g_nMedianBlurValue *  + ;
    medianBlur(g_mSrcImage, g_mDstImage, g_nkernelSize);

    imshow("中值濾波圖像", g_mDstImage);
}
           

運作結果:

opencv學習(二十一)之中值濾波medianBlur

程式說明:

對于程式中對圖像深度的判斷根據如下标準:

CV_8U - -bit unsigned integers (  )
    CV_8S - -bit signed integers ( - )
    CV_16U - -bit unsigned integers (  )
    CV_16S - -bit signed integers ( - )
    CV_32S - -bit signed integers ( - )
    CV_32F - -bit floating-point numbers ( -FLT_MAX..FLT_MAX, INF, NAN )
    CV_64F - -bit floating-point numbers ( -DBL_MAX..DBL_MAX, INF, NAN )
           

繼續閱讀