熱線(xian)電話:0755-23712116
郵箱:contact@legoupos.cn
地址:深圳市寶安區(qu)沙井街道后亭茅(mao)洲山(shan)工(gong)業園工(gong)業大廈全至科技創新園科創大廈2層2A
本(ben)文主要介紹(shao)了(le)自適(shi)應(ying)的中值(zhi)濾(lv)(lv)(lv)波器(qi)(qi),并基于OpenCV實現(xian)了(le)該濾(lv)(lv)(lv)波器(qi)(qi),并且將自適(shi)應(ying)的中值(zhi)濾(lv)(lv)(lv)波器(qi)(qi)和常(chang)規的中值(zhi)濾(lv)(lv)(lv)波器(qi)(qi)對(dui)不(bu)同概率的椒鹽噪聲的過(guo)濾(lv)(lv)(lv)效果(guo)進行了(le)對(dui)比。最后(hou),對(dui)中值(zhi)濾(lv)(lv)(lv)波器(qi)(qi)的優(you)缺(que)點了(le)進行了(le)總結。
空(kong)間(jian)濾(lv)波(bo)器
一個(ge)空間(jian)濾波器包括兩個(ge)部分:
· 一個(ge)鄰域(yu),濾波器(qi)進行操作的像素集(ji)合,通(tong)常是一個(ge)矩形區域(yu)
· 對(dui)鄰域中(zhong)像素進(jin)行的(de)操作
一個濾波器就是在選定的鄰域像素上執行預先定義好的操作產生新的像素,并用新的像素替換掉原來像素形成新的圖像。
通常,也可以將濾波器稱之為核(kernel),模板(template)或者窗口(window)。
根據預定義的(de)操作,可(ke)以將濾波器分(fen)為:
· 線(xian)性濾波(bo)器
· 非線性濾波器
而根(gen)據(ju)濾波器(qi)最終對圖像造成的影響,可以將濾波器(qi)分為:
· 平滑濾波器(qi) ,通常用于模糊圖像或者(zhe)去除(chu)圖像中的噪聲
· 銳化濾波器,突出圖像中的邊緣細節部(bu)分
中值濾波器 Median Filter
中值濾(lv)(lv)波器是一(yi)種(zhong)常(chang)用的非線性(xing)濾(lv)(lv)波器,其(qi)基(ji)本原理是選擇待處理像(xiang)素(su)(su)的一(yi)個鄰域中各像(xiang)素(su)(su)值的中值來代替待處理的像(xiang)素(su)(su),其(qi)主要功能是像(xiang)素(su)(su)的灰度值與(yu)周圍(wei)像(xiang)素(su)(su)比較(jiao)接近,從而消(xiao)除孤立的噪聲點(dian),所以中值濾(lv)(lv)波器能夠很好的消(xiao)除椒鹽噪聲。不(bu)僅如此,中值濾(lv)(lv)波器在(zai)消(xiao)除噪聲的同(tong)時,還(huan)能有效的保(bao)護圖像(xiang)的邊(bian)界信息,不(bu)會(hui)對圖像(xiang)造(zao)成很大的模糊(相比于均值濾(lv)(lv)波器)。
中值濾(lv)波(bo)(bo)器的(de)(de)(de)效果(guo)受(shou)濾(lv)波(bo)(bo)窗口(kou)尺寸(cun)的(de)(de)(de)影(ying)響較大(da),在(zai)消除噪聲(sheng)(sheng)和保護圖(tu)(tu)(tu)像(xiang)(xiang)的(de)(de)(de)細節(jie)存(cun)在(zai)著矛(mao)盾:濾(lv)波(bo)(bo)窗口(kou)較小,則(ze)能(neng)很好的(de)(de)(de)保護圖(tu)(tu)(tu)像(xiang)(xiang)中的(de)(de)(de)某些細節(jie),但(dan)對噪聲(sheng)(sheng)的(de)(de)(de)過濾(lv)效果(guo)就(jiu)不(bu)是(shi)很好;反之(zhi),窗口(kou)尺寸(cun)較大(da)有較好的(de)(de)(de)噪聲(sheng)(sheng)過濾(lv)效果(guo),但(dan)是(shi)會對圖(tu)(tu)(tu)像(xiang)(xiang)造成(cheng)一定的(de)(de)(de)模糊。另外,根(gen)據中值濾(lv)波(bo)(bo)器原(yuan)理,如果(guo)在(zai)濾(lv)波(bo)(bo)窗口(kou)內的(de)(de)(de)噪聲(sheng)(sheng)點(dian)的(de)(de)(de)個數(shu)大(da)于整個窗口(kou)內像(xiang)(xiang)素的(de)(de)(de)個數(shu),則(ze)中值濾(lv)波(bo)(bo)就(jiu)不(bu)能(neng)很好的(de)(de)(de)過濾(lv)掉噪聲(sheng)(sheng)。
自(zi)適應中值濾波(bo)器(qi) Adaptive Median Filter
上(shang)(shang)面(mian)提到(dao)常規的(de)中(zhong)值(zhi)濾波器,在(zai)噪(zao)聲(sheng)的(de)密度(du)(du)不是(shi)(shi)很大的(de)情況(kuang)下(根據(ju)經(jing)驗,噪(zao)聲(sheng)的(de)出現的(de)概率小(xiao)于0.2),效果(guo)不錯。但是(shi)(shi)當概率出現的(de)概率較高(gao)時,常規的(de)中(zhong)值(zhi)濾波的(de)效果(guo)就不是(shi)(shi)很好了。有一個選擇就是(shi)(shi)增(zeng)大濾波器的(de)窗口大小(xiao),這(zhe)雖然在(zai)一定程(cheng)度(du)(du)上(shang)(shang)能解決上(shang)(shang)述的(de)問(wen)題,但是(shi)(shi)會給圖像造成較大的(de)模糊(hu)。
常規的中值濾波器的窗口尺寸是固定大小不變的,就不能同時兼顧去噪和保護圖像的細節。這時就要尋求一種改變,根據預先設定好的條件,在濾波的過程中,動態的改變濾波器的窗口尺寸大小,這就是自適應中值濾波器 Adaptive Median Filter。在(zai)濾(lv)(lv)波的(de)(de)過程中,自適應中值濾(lv)(lv)波器會(hui)根據預先設(she)定好的(de)(de)條(tiao)件(jian),改變濾(lv)(lv)波窗(chuang)口的(de)(de)尺寸大(da)小,同時(shi)還會(hui)根據一定的(de)(de)條(tiao)件(jian)判斷當前像素是不(bu)是噪聲(sheng),如(ru)果是則用鄰(lin)域中值替換掉當前像素;不(bu)是,則不(bu)作改變。
自適應(ying)中(zhong)值(zhi)濾(lv)波器(qi)有(you)三個目的:
· 濾除椒鹽(yan)噪聲
· 平滑其他非(fei)脈沖噪聲
· 盡(jin)可能的保護圖(tu)像中細節信(xin)息,避免圖(tu)像邊緣的細化或者粗化。
自使用中(zhong)值濾(lv)波算法描述
自適(shi)應(ying)濾(lv)(lv)波(bo)(bo)(bo)器不(bu)但能夠(gou)濾(lv)(lv)除概(gai)率(lv)較大的(de)椒(jiao)鹽噪聲,而且能夠(gou)更(geng)好的(de)保護圖像的(de)細節,這是常規(gui)的(de)中(zhong)(zhong)值濾(lv)(lv)波(bo)(bo)(bo)器做不(bu)到的(de)。自適(shi)應(ying)的(de)中(zhong)(zhong)值濾(lv)(lv)波(bo)(bo)(bo)器也需要一個(ge)(ge)矩形(xing)的(de)窗口(kou)SxySxy,和(he)常規(gui)中(zhong)(zhong)值濾(lv)(lv)波(bo)(bo)(bo)器不(bu)同的(de)是這個(ge)(ge)窗口(kou)的(de)大小會(hui)在濾(lv)(lv)波(bo)(bo)(bo)處理的(de)過程中(zhong)(zhong)進行改(gai)變(增大)。需要注(zhu)意的(de)是,濾(lv)(lv)波(bo)(bo)(bo)器的(de)輸出是一個(ge)(ge)像素(su)值,該值用來替換點(x,y)(x,y)處的(de)像素(su)值,點(x,y)(x,y)是濾(lv)(lv)波(bo)(bo)(bo)窗口(kou)的(de)中(zhong)(zhong)心位置。
在描述自適應中值濾波器時需要用到如下的符號:
· Zmin=SxyZmin=Sxy中的最小灰度值(zhi)
· Zmax=SxyZmax=Sxy中的最大灰度(du)值
· Zmed=SxyZmed=Sxy中的灰度值(zhi)的中值(zhi)
· ZxyZxy表示(shi)坐標(x,y)(x,y)處的灰度值
· Smax=SxySmax=Sxy允許的最大窗(chuang)口尺寸
自適應中值濾波器有兩個處理過程,分別記為: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
否則輸(shu)出(chu)ZmedZmed
自適(shi)應中(zhong)值(zhi)濾波(bo)原(yuan)理說明
過程A的(de)目的(de)是(shi)(shi)(shi)(shi)確(que)定當(dang)前窗(chuang)口(kou)內得到中(zhong)值ZmedZmed是(shi)(shi)(shi)(shi)否(fou)是(shi)(shi)(shi)(shi)噪(zao)聲(sheng)。如(ru)果Zmin<Zmed<ZmaxZmin<Zmed<Zmax,則(ze)(ze)中(zhong)值ZmedZmed不(bu)(bu)是(shi)(shi)(shi)(shi)噪(zao)聲(sheng),這時轉(zhuan)到過程B測(ce)試(shi),當(dang)前窗(chuang)口(kou)的(de)中(zhong)心位置的(de)像素ZxyZxy是(shi)(shi)(shi)(shi)否(fou)是(shi)(shi)(shi)(shi)一個噪(zao)聲(sheng)點。如(ru)果Zmin<Zxy<ZmaxZmin<Zxy<Zmax,則(ze)(ze)ZxyZxy不(bu)(bu)是(shi)(shi)(shi)(shi)一個噪(zao)聲(sheng),此時濾波(bo)器(qi)輸(shu)出(chu)ZxyZxy;如(ru)果不(bu)(bu)滿足上(shang)述條件,則(ze)(ze)可判定ZxyZxy是(shi)(shi)(shi)(shi)噪(zao)聲(sheng),這是(shi)(shi)(shi)(shi)輸(shu)出(chu)中(zhong)值ZmedZmed(在A中(zhong)已經判斷出(chu)ZmedZmed不(bu)(bu)是(shi)(shi)(shi)(shi)噪(zao)聲(sheng))。
如果在(zai)過程A中(zhong),得到(dao)(dao)則(ze)ZmedZmed不(bu)符合條件Zmin<Zmed<ZmaxZmin<Zmed<Zmax,則(ze)可判斷得到(dao)(dao)的(de)(de)(de)中(zhong)值ZmedZmed是一(yi)個噪聲。在(zai)這種情況下(xia),需要增(zeng)大(da)濾(lv)波(bo)器的(de)(de)(de)窗(chuang)口尺寸,在(zai)一(yi)個更大(da)的(de)(de)(de)范(fan)圍內尋找一(yi)個非(fei)噪聲點的(de)(de)(de)中(zhong)值,直到(dao)(dao)找到(dao)(dao)一(yi)個非(fei)噪聲的(de)(de)(de)中(zhong)值,跳轉到(dao)(dao)B;或(huo)者,窗(chuang)口的(de)(de)(de)尺寸達到(dao)(dao)了最(zui)大(da)值,這時返回找到(dao)(dao)的(de)(de)(de)中(zhong)值,退出。
從上面分(fen)析可知,噪聲出現(xian)(xian)的概(gai)率較(jiao)低,自適應中值濾(lv)波(bo)器(qi)可以(yi)較(jiao)快的得出結果,不需(xu)要(yao)去增(zeng)加(jia)窗(chuang)(chuang)口(kou)的尺寸(cun);反之,噪聲的出現(xian)(xian)的概(gai)率較(jiao)高,則需(xu)要(yao)增(zeng)大(da)濾(lv)波(bo)器(qi)的窗(chuang)(chuang)口(kou)尺寸(cun),這也(ye)符合種中值濾(lv)波(bo)器(qi)的特點:噪聲點比較(jiao)多時,需(xu)要(yao)更(geng)大(da)的濾(lv)波(bo)器(qi)窗(chuang)(chuang)口(kou)尺寸(cun)。
實現
有(you)了算法(fa)的詳細(xi)描述(shu),借助于OpenCV對圖像的讀寫(xie),自適應中值濾(lv)波器實現起來也不是很(hen)困難。
int minSize = 3; // 濾波器窗(chuang)口的起(qi)始(shi)尺寸
int maxSize = 7; // 濾波器窗口的最(zui)大尺(chi)寸
Mat im1;
// 擴展圖像(xiang)的邊界
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的文檔信息。
下面就(jiu)是遍歷圖像(xiang)(xiang)的(de)像(xiang)(xiang)素(su),對每個(ge)像(xiang)(xiang)素(su)進(jin)行濾(lv)波(bo)處理。需要(yao)注意一點,不論濾(lv)波(bo)器多么的(de)復雜,其每次(ci)的(de)濾(lv)波(bo)過程(cheng),都是值返回(hui)一個(ge)值,來替換掉(diao)當前(qian)窗口的(de)中(zhong)心的(de)像(xiang)(xiang)素(su)值。函數adpativeProcess就(jiu)是對當前(qian)像(xiang)(xiang)素(su)的(de)濾(lv)波(bo)過程(cheng),其代碼如下:
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;
}
}
首先,根(gen)據(ju)當(dang)前(qian)窗口的大小,取(qu)(qu)得所有像素值(zhi)(zhi)(zhi)存(cun)放到vector中(zhong),然后對vector進行(xing)(xing)排序,取(qu)(qu)得像素的最(zui)小值(zhi)(zhi)(zhi)、最(zui)大值(zhi)(zhi)(zhi)和中(zhong)值(zhi)(zhi)(zhi)。然后測試(shi)當(dang)前(qian)取(qu)(qu)得的中(zhong)值(zhi)(zhi)(zhi)是(shi)(shi)否在(min,max)之間,如果是(shi)(shi),則(ze)中(zhong)值(zhi)(zhi)(zhi)不是(shi)(shi)噪(zao)聲(sheng)點,則(ze)開始對當(dang)前(qian)像素值(zhi)(zhi)(zhi)進行(xing)(xing)處理,判斷其是(shi)(shi)否是(shi)(shi)噪(zao)聲(sheng)點。如果,測試(shi)當(dang)前(qian)已取(qu)(qu)得的中(zhong)值(zhi)(zhi)(zhi)是(shi)(shi)噪(zao)聲(sheng)點,則(ze)擴(kuo)大窗口的尺寸,在更大的空(kong)間中(zhong)重新尋找(zhao)中(zhong)值(zhi)(zhi)(zhi)。
上面自適應中值濾波器實現起來比較簡單,所以問題就來了:效率及其的低下。這里(li),這是對自適應中值濾波器的(de)原理的(de)學習,可以忽略這個不必(bi)要的(de)細節。
結果對比
左邊(bian)是添加概(gai)率為0.2的椒鹽噪(zao)聲(sheng),右邊(bian)是原(yuan)圖。下面是使用常(chang)規的中值濾波(bo)和本文實現的自適應中值濾波(bo)器(qi)后(hou)的處理結(jie)果
左邊是自適應中(zhong)(zhong)值(zhi)(zhi)濾(lv)波(bo)(bo)器(qi)(最(zui)小窗口(kou)為3,最(zui)大窗口(kou)為7)的(de)結(jie)果,右圖(tu)是常(chang)規中(zhong)(zhong)值(zhi)(zhi)濾(lv)波(bo)(bo)器(qi)(窗口(kou)大小為5)的(de)結(jie)果。可以看出,無論是中(zhong)(zhong)值(zhi)(zhi)濾(lv)波(bo)(bo)還(huan)是自適應的(de)中(zhong)(zhong)值(zhi)(zhi)濾(lv)波(bo)(bo),都能(neng)過(guo)濾(lv)掉圖(tu)像(xiang)中(zhong)(zhong)的(de)噪(zao)聲,自適應中(zhong)(zhong)值(zhi)(zhi)濾(lv)波(bo)(bo)器(qi)的(de)效果要好(hao)些,常(chang)規的(de)還(huan)有一些噪(zao)聲沒有過(guo)濾(lv)掉。而且(qie),常(chang)規的(de)中(zhong)(zhong)值(zhi)(zhi)濾(lv)波(bo)(bo)器(qi)對圖(tu)像(xiang)造成(cheng)的(de)模糊較明顯,而自適應中(zhong)(zhong)值(zhi)(zhi)濾(lv)波(bo)(bo)器(qi)很(hen)好(hao)的(de)的(de)保存了圖(tu)像(xiang)中(zhong)(zhong)的(de)細節。
下面測試(shi)更大(da)概(gai)率噪聲下,兩(liang)種(zhong)濾(lv)波器的工(gong)作情況。噪聲概(gai)率為0.4時,
可以(yi)(yi)看出(chu),常規的(de)中值(zhi)濾波器已經(jing)不能(neng)很好的(de)過濾掉(diao)噪(zao)聲,而自適應的(de)中值(zhi)濾波還可以(yi)(yi)勝任。
中值濾波器總(zong)結
· 中(zhong)值(zhi)濾波器(qi)(qi)能夠(gou)很好的濾除“椒(jiao)鹽(yan)”噪聲(sheng)(sheng)。椒(jiao)鹽(yan)噪聲(sheng)(sheng)是在圖像(xiang)上隨機出現的孤立(li)點(dian),根(gen)據(ju)中(zhong)值(zhi)濾波器(qi)(qi)的原理,使用鄰域像(xiang)素(su)的中(zhong)值(zhi)代替原像(xiang)素(su),能夠(gou)有效的消(xiao)除這(zhe)些孤立(li)的噪聲(sheng)(sheng)點(dian)。
· 和(he)均值濾(lv)波(bo)器相(xiang)比(bi),中(zhong)值濾(lv)波(bo)在(zai)消除噪聲的同時(shi),還能在(zai)很(hen)大程度保護圖(tu)像的細節,不會造成很(hen)大的模(mo)糊。
· 和常規(gui)的中值濾波器相比(bi),自適應中值濾波器能夠(gou)更好的保護(hu)圖(tu)像中的邊緣細(xi)節(jie)部分。
文章轉自Brook_icv //www.cnblogs.com/wangguchangqing/p/6379646.html