欧美日韩在线第一页-欧美日韩在线观看精品-欧美日韩在线观看一区二区-欧美日韩在线免费看-欧美日韩在线视频不卡一区二区三区

圖像處理
新聞詳情

圖像處理基礎(2):自適應中值濾波器(基于OpenCV實現)

發布時間:2021-01-06 15:59:29 最后更新:2021-01-06 16:23:25 瀏覽次數:4509

本文主要介紹了自適應的中值濾波器,并基于OpenCV實現了該濾波器,并且將自適應的中值濾波器和常規的中值濾波器對不同概率的椒鹽噪聲的過濾效果進行了對比。最后,對中值濾波器的優缺點了進行了總結。

空間濾波器

一個空間濾波器包括兩個部分:

·        一個鄰域,濾波器進行操作的像素集合,通常是一個矩形區域

·        對鄰域中像素進行的操作

一個濾波器就是在選定的鄰域像素上執行預先定義好的操作產生新的像素,并用新的像素替換掉原來像素形成新的圖像。
通常,也可以將濾波器稱之為核(kernel),模板(template)或者窗口(window)

根據預定義的操作,可以將濾波器分為:

·        線性濾波器

·        非線性濾波器

而根據濾波器最終對圖像造成的影響,可以將濾波器分為:

·        平滑濾波器 ,通常用于模糊圖像或者去除圖像中的噪聲

·        銳化濾波器,突出圖像中的邊緣細節部分

中值濾波器 Median Filter

中值濾波器是一種常用的非線性濾波器,其基本原理是選擇待處理像素的一個鄰域中各像素值的中值來代替待處理的像素,其主要功能是像素的灰度值與周圍像素比較接近,從而消除孤立的噪聲點,所以中值濾波器能夠很好的消除椒鹽噪聲。不僅如此,中值濾波器在消除噪聲的同時,還能有效的保護圖像的邊界信息,不會對圖像造成很大的模糊(相比于均值濾波器)。

中值濾波器的效果受濾波窗口尺寸的影響較大,在消除噪聲和保護圖像的細節存在著矛盾:濾波窗口較小,則能很好的保護圖像中的某些細節,但對噪聲的過濾效果就不是很好;反之,窗口尺寸較大有較好的噪聲過濾效果,但是會對圖像造成一定的模糊。另外,根據中值濾波器原理,如果在濾波窗口內的噪聲點的個數大于整個窗口內像素的個數,則中值濾波就不能很好的過濾掉噪聲。

自適應中值濾波器 Adaptive Median Filter

上面提到常規的中值濾波器,在噪聲的密度不是很大的情況下(根據經驗,噪聲的出現的概率小于0.2),效果不錯。但是當概率出現的概率較高時,常規的中值濾波的效果就不是很好了。有一個選擇就是增大濾波器的窗口大小,這雖然在一定程度上能解決上述的問題,但是會給圖像造成較大的模糊。

常規的中值濾波器的窗口尺寸是固定大小不變的,就不能同時兼顧去噪和保護圖像的細節。這時就要尋求一種改變,根據預先設定好的條件,在濾波的過程中,動態的改變濾波器的窗口尺寸大小,這就是自適應中值濾波器 Adaptive Median Filter。在濾波的過程中,自適應中值濾波器會根據預先設定好的條件,改變濾波窗口的尺寸大小,同時還會根據一定的條件判斷當前像素是不是噪聲,如果是則用鄰域中值替換掉當前像素;不是,則不作改變。

自適應中值濾波器有三個目的:

·        濾除椒鹽噪聲

·        平滑其他非脈沖噪聲

·        盡可能的保護圖像中細節信息,避免圖像邊緣的細化或者粗化。

自使用中值濾波算法描述

自適應濾波器不但能夠濾除概率較大的椒鹽噪聲,而且能夠更好的保護圖像的細節,這是常規的中值濾波器做不到的。自適應的中值濾波器也需要一個矩形的窗口SxySxy,和常規中值濾波器不同的是這個窗口的大小會在濾波處理的過程中進行改變(增大)。需要注意的是,濾波器的輸出是一個像素值,該值用來替換點(x,y)(x,y)處的像素值,點(x,y)(x,y)是濾波窗口的中心位置。

在描述自適應中值濾波器時需要用到如下的符號:

·        Zmin=SxyZmin=Sxy中的最小灰度值

·        Zmax=SxyZmax=Sxy中的最大灰度值

·        Zmed=SxyZmed=Sxy中的灰度值的中值

·        ZxyZxy表示坐標(x,y)(x,y)處的灰度值

·        Smax=SxySmax=Sxy允許的最大窗口尺寸

自適應中值濾波器有兩個處理過程,分別記為:A和B。
A :
A1 = Zmed?ZminZmed?Zmin
A2 = Zmed?ZmaxZmed?Zmax
如果A1> 0 且 A2 < 0,跳轉到 B;
否則,增大窗口的尺寸
如果增大后窗口的尺寸 ≤Smax≤Smax,則重復A過程。
否則,輸出ZmedZmed

B:
B1 = Zxy?ZminZxy?Zmin
B2 = Zxy?ZmaxZxy?Zmax
如果B1> 0 且 B2 < 0,則輸出ZxyZxy
否則輸出ZmedZmed

自適應中值濾波原理說明

過程A的目的是確定當前窗口內得到中值ZmedZmed是否是噪聲。如果Zmin<Zmed<ZmaxZmin<Zmed<Zmax,則中值ZmedZmed不是噪聲,這時轉到過程B測試,當前窗口的中心位置的像素ZxyZxy是否是一個噪聲點。如果Zmin<Zxy<ZmaxZmin<Zxy<Zmax,則ZxyZxy不是一個噪聲,此時濾波器輸出ZxyZxy;如果不滿足上述條件,則可判定ZxyZxy是噪聲,這是輸出中值ZmedZmed(在A中已經判斷出ZmedZmed不是噪聲)。

如果在過程A中,得到則ZmedZmed不符合條件Zmin<Zmed<ZmaxZmin<Zmed<Zmax,則可判斷得到的中值ZmedZmed是一個噪聲。在這種情況下,需要增大濾波器的窗口尺寸,在一個更大的范圍內尋找一個非噪聲點的中值,直到找到一個非噪聲的中值,跳轉到B;或者,窗口的尺寸達到了最大值,這時返回找到的中值,退出。

從上面分析可知,噪聲出現的概率較低,自適應中值濾波器可以較快的得出結果,不需要去增加窗口的尺寸;反之,噪聲的出現的概率較高,則需要增大濾波器的窗口尺寸,這也符合種中值濾波器的特點:噪聲點比較多時,需要更大的濾波器窗口尺寸。

實現

有了算法的詳細描述,借助于OpenCV對圖像的讀寫,自適應中值濾波器實現起來也不是很困難。

    int minSize = 3; // 濾波器窗口的起始尺寸
    int maxSize = 7; // 濾波器窗口的最大尺寸
    Mat im1;
    // 擴展圖像的邊界
    copyMakeBorder(im, im1, maxSize / 2, maxSize / 2, maxSize / 2, maxSize / 2, BorderTypes::BORDER_REFLECT);
    // 圖像循環
    for (int j = maxSize / 2; j < im1.rows - maxSize / 2; j++)
    {
        for (int i = maxSize / 2; i < im1.cols * im1.channels() - maxSize / 2; i++)
        {
            im1.at(j, i) = adaptiveProcess(im1, j, i, minSize, maxSize);
        }
    }

首先定義濾波器最小的窗口尺寸以及最大的窗口尺寸。
要進行濾波處理,首先要擴展圖像的邊界,以便對圖像的邊界像素進行處理。copyMakeBorder根據選擇的BorderTypes使用不同的值擴充圖像的邊界像素,具體可參考OpenCV的文檔信息。
下面就是遍歷圖像的像素,對每個像素進行濾波處理。需要注意一點,不論濾波器多么的復雜,其每次的濾波過程,都是值返回一個值,來替換掉當前窗口的中心的像素值。函數adpativeProcess就是對當前像素的濾波過程,其代碼如下:

uchar adaptiveProcess(const Mat &im, int row,int col,int kernelSize,int maxSize)
{
    vector pixels;
    for (int a = -kernelSize / 2; a <= kernelSize / 2; a++)
        for (int b = -kernelSize / 2; b <= kernelSize / 2; b++)
        {
            pixels.push_back(im.at(row + a, col + b));
        }
    sort(pixels.begin(), pixels.end());
    auto min = pixels[0];
    auto max = pixels[kernelSize * kernelSize - 1];
    auto med = pixels[kernelSize * kernelSize / 2];
    auto zxy = im.at(row, col);
    if (med > min && med < max)
    {
        // to B
        if (zxy > min && zxy < max)
            return zxy;
        else
            return med;
    }
    else
    {
        kernelSize += 2;
        if (kernelSize <= maxSize)
            return adpativeProcess(im, row, col, kernelSize, maxSize); // 增大窗口尺寸,繼續A過程。
        else
            return med;
    }
}

首先,根據當前窗口的大小,取得所有像素值存放到vector中,然后對vector進行排序,取得像素的最小值、最大值和中值。然后測試當前取得的中值是否在(min,max)之間,如果是,則中值不是噪聲點,則開始對當前像素值進行處理,判斷其是否是噪聲點。如果,測試當前已取得的中值是噪聲點,則擴大窗口的尺寸,在更大的空間中重新尋找中值。

上面自適應中值濾波器實現起來比較簡單,所以問題就來了:效率及其的低下。這里,這是對自適應中值濾波器的原理的學習,可以忽略這個不必要的細節。

結果對比


左邊是添加概率為0.2的椒鹽噪聲,右邊是原圖。下面是使用常規的中值濾波和本文實現的自適應中值濾波器后的處理結果


左邊是自適應中值濾波器(最小窗口為3,最大窗口為7)的結果,右圖是常規中值濾波器(窗口大小為5)的結果。可以看出,無論是中值濾波還是自適應的中值濾波,都能過濾掉圖像中的噪聲,自適應中值濾波器的效果要好些,常規的還有一些噪聲沒有過濾掉。而且,常規的中值濾波器對圖像造成的模糊較明顯,而自適應中值濾波器很好的的保存了圖像中的細節。

下面測試更大概率噪聲下,兩種濾波器的工作情況。噪聲概率為0.4時,


可以看出,常規的中值濾波器已經不能很好的過濾掉噪聲,而自適應的中值濾波還可以勝任。

中值濾波器總結

·        中值濾波器能夠很好的濾除“椒鹽”噪聲。椒鹽噪聲是在圖像上隨機出現的孤立點,根據中值濾波器的原理,使用鄰域像素的中值代替原像素,能夠有效的消除這些孤立的噪聲點。

·        和均值濾波器相比,中值濾波在消除噪聲的同時,還能在很大程度保護圖像的細節,不會造成很大的模糊。

·        和常規的中值濾波器相比,自適應中值濾波器能夠更好的保護圖像中的邊緣細節部分。

 

文章轉自Brook_icv   https://www.cnblogs.com/wangguchangqing/p/6379646.html

在線客服 雙翌客服
客服電話
  • 0755-23712116
  • 13310869691
主站蜘蛛池模板: xxxxxxxx日本人| 色综合天天综合中文网| 日本888xxxx| 亚洲精品一区二区三区四区五区| 国产丝袜福利| 爱爱网站在线观看免费| 国产精品第五页| 久久在线精品视频| 无码免费一区二区三区免费播放 | 一级一级特黄女人精品毛片视频| 亚洲国产一二三| 色在线观看视频| 欧美成人免费一级人片| 国产免费福利网站| 视频黄色免费| 最刺激黄a大片老师| 成人污视频| 久草水蜜桃| 欧美 日韩 中文字幕| 婷婷久| 91极品尤物| 一级坐爱| 一级做a爰性色毛片| 日本一级www| 中文字幕曰韩一区二区不卡| 在线视频97| 伊人久久中文字幕| 免费播放特黄特色毛片| 欧洲美女与黑人性大战| 国产成人亚洲综合网站不卡| 香蕉网站狼人久久五月亭亭| 黄色网免费看| 黄色网址国产| 韩国毛片在线观看| 精品国产一区在线观看| 97久视频精品视频在线老司机| 国产粗大猛烈18p| 国产精品免费麻豆入口| 国产亚洲精品久久久极品美女| 久久久久久天天夜夜天天| 免费观看国产网址你懂的|