熱線電話:0755-23712116
郵箱:contact@shuangyi-tech.com
地址:深圳市寶安區(qū)沙井街道后亭茅洲山工業(yè)園工業(yè)大廈全至科技創(chuàng)新園科創(chuàng)大廈2層2A
本文主要介紹了自適應(yīng)的中值濾波器,并基于OpenCV實現(xiàn)了該濾波器,并且將自適應(yīng)的中值濾波器和常規(guī)的中值濾波器對不同概率的椒鹽噪聲的過濾效果進行了對比。最后,對中值濾波器的優(yōu)缺點了進行了總結(jié)。
空間濾波器
一個空間濾波器包括兩個部分:
· 一個鄰域,濾波器進行操作的像素集合,通常是一個矩形區(qū)域
· 對鄰域中像素進行的操作
一個濾波器就是在選定的鄰域像素上執(zhí)行預(yù)先定義好的操作產(chǎn)生新的像素,并用新的像素替換掉原來像素形成新的圖像。
通常,也可以將濾波器稱之為核(kernel),模板(template)或者窗口(window)。
根據(jù)預(yù)定義的操作,可以將濾波器分為:
· 線性濾波器
· 非線性濾波器
而根據(jù)濾波器最終對圖像造成的影響,可以將濾波器分為:
· 平滑濾波器 ,通常用于模糊圖像或者去除圖像中的噪聲
· 銳化濾波器,突出圖像中的邊緣細節(jié)部分
中值濾波器 Median Filter
中值濾波器是一種常用的非線性濾波器,其基本原理是選擇待處理像素的一個鄰域中各像素值的中值來代替待處理的像素,其主要功能是像素的灰度值與周圍像素比較接近,從而消除孤立的噪聲點,所以中值濾波器能夠很好的消除椒鹽噪聲。不僅如此,中值濾波器在消除噪聲的同時,還能有效的保護圖像的邊界信息,不會對圖像造成很大的模糊(相比于均值濾波器)。
中值濾波器的效果受濾波窗口尺寸的影響較大,在消除噪聲和保護圖像的細節(jié)存在著矛盾:濾波窗口較小,則能很好的保護圖像中的某些細節(jié),但對噪聲的過濾效果就不是很好;反之,窗口尺寸較大有較好的噪聲過濾效果,但是會對圖像造成一定的模糊。另外,根據(jù)中值濾波器原理,如果在濾波窗口內(nèi)的噪聲點的個數(shù)大于整個窗口內(nèi)像素的個數(shù),則中值濾波就不能很好的過濾掉噪聲。
自適應(yīng)中值濾波器 Adaptive Median Filter
上面提到常規(guī)的中值濾波器,在噪聲的密度不是很大的情況下(根據(jù)經(jīng)驗,噪聲的出現(xiàn)的概率小于0.2),效果不錯。但是當概率出現(xiàn)的概率較高時,常規(guī)的中值濾波的效果就不是很好了。有一個選擇就是增大濾波器的窗口大小,這雖然在一定程度上能解決上述的問題,但是會給圖像造成較大的模糊。
常規(guī)的中值濾波器的窗口尺寸是固定大小不變的,就不能同時兼顧去噪和保護圖像的細節(jié)。這時就要尋求一種改變,根據(jù)預(yù)先設(shè)定好的條件,在濾波的過程中,動態(tài)的改變?yōu)V波器的窗口尺寸大小,這就是自適應(yīng)中值濾波器 Adaptive Median Filter。在濾波的過程中,自適應(yīng)中值濾波器會根據(jù)預(yù)先設(shè)定好的條件,改變?yōu)V波窗口的尺寸大小,同時還會根據(jù)一定的條件判斷當前像素是不是噪聲,如果是則用鄰域中值替換掉當前像素;不是,則不作改變。
自適應(yīng)中值濾波器有三個目的:
· 濾除椒鹽噪聲
· 平滑其他非脈沖噪聲
· 盡可能的保護圖像中細節(jié)信息,避免圖像邊緣的細化或者粗化。
自使用中值濾波算法描述
自適應(yīng)濾波器不但能夠濾除概率較大的椒鹽噪聲,而且能夠更好的保護圖像的細節(jié),這是常規(guī)的中值濾波器做不到的。自適應(yīng)的中值濾波器也需要一個矩形的窗口SxySxy,和常規(guī)中值濾波器不同的是這個窗口的大小會在濾波處理的過程中進行改變(增大)。需要注意的是,濾波器的輸出是一個像素值,該值用來替換點(x,y)(x,y)處的像素值,點(x,y)(x,y)是濾波窗口的中心位置。
在描述自適應(yīng)中值濾波器時需要用到如下的符號:
· Zmin=SxyZmin=Sxy中的最小灰度值
· Zmax=SxyZmax=Sxy中的最大灰度值
· Zmed=SxyZmed=Sxy中的灰度值的中值
· ZxyZxy表示坐標(x,y)(x,y)處的灰度值
· Smax=SxySmax=Sxy允許的最大窗口尺寸
自適應(yīng)中值濾波器有兩個處理過程,分別記為:A和B。
A :
A1 = Zmed?ZminZmed?Zmin
A2 = Zmed?ZmaxZmed?Zmax
如果A1> 0 且 A2 < 0,跳轉(zhuǎn)到 B;
否則,增大窗口的尺寸
如果增大后窗口的尺寸 ≤Smax≤Smax,則重復(fù)A過程。
否則,輸出ZmedZmed
B:
B1 = Zxy?ZminZxy?Zmin
B2 = Zxy?ZmaxZxy?Zmax
如果B1> 0 且 B2 < 0,則輸出ZxyZxy
否則輸出ZmedZmed
自適應(yīng)中值濾波原理說明
過程A的目的是確定當前窗口內(nèi)得到中值ZmedZmed是否是噪聲。如果Zmin<Zmed<ZmaxZmin<Zmed<Zmax,則中值ZmedZmed不是噪聲,這時轉(zhuǎn)到過程B測試,當前窗口的中心位置的像素ZxyZxy是否是一個噪聲點。如果Zmin<Zxy<ZmaxZmin<Zxy<Zmax,則ZxyZxy不是一個噪聲,此時濾波器輸出ZxyZxy;如果不滿足上述條件,則可判定ZxyZxy是噪聲,這是輸出中值ZmedZmed(在A中已經(jīng)判斷出ZmedZmed不是噪聲)。
如果在過程A中,得到則ZmedZmed不符合條件Zmin<Zmed<ZmaxZmin<Zmed<Zmax,則可判斷得到的中值ZmedZmed是一個噪聲。在這種情況下,需要增大濾波器的窗口尺寸,在一個更大的范圍內(nèi)尋找一個非噪聲點的中值,直到找到一個非噪聲的中值,跳轉(zhuǎn)到B;或者,窗口的尺寸達到了最大值,這時返回找到的中值,退出。
從上面分析可知,噪聲出現(xiàn)的概率較低,自適應(yīng)中值濾波器可以較快的得出結(jié)果,不需要去增加窗口的尺寸;反之,噪聲的出現(xiàn)的概率較高,則需要增大濾波器的窗口尺寸,這也符合種中值濾波器的特點:噪聲點比較多時,需要更大的濾波器窗口尺寸。
實現(xiàn)
有了算法的詳細描述,借助于OpenCV對圖像的讀寫,自適應(yīng)中值濾波器實現(xiàn)起來也不是很困難。
int minSize = 3; // 濾波器窗口的起始尺寸
int maxSize = 7; // 濾波器窗口的最大尺寸
Mat im1;
// 擴展圖像的邊界
copyMakeBorder(im, im1, maxSize / 2, maxSize / 2, maxSize / 2, maxSize / 2, BorderTypes::BORDER_REFLECT);
// 圖像循環(huán)
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根據(jù)選擇的BorderTypes使用不同的值擴充圖像的邊界像素,具體可參考OpenCV的文檔信息。
下面就是遍歷圖像的像素,對每個像素進行濾波處理。需要注意一點,不論濾波器多么的復(fù)雜,其每次的濾波過程,都是值返回一個值,來替換掉當前窗口的中心的像素值。函數(shù)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); // 增大窗口尺寸,繼續(xù)A過程。
else
return med;
}
}
首先,根據(jù)當前窗口的大小,取得所有像素值存放到vector中,然后對vector進行排序,取得像素的最小值、最大值和中值。然后測試當前取得的中值是否在(min,max)之間,如果是,則中值不是噪聲點,則開始對當前像素值進行處理,判斷其是否是噪聲點。如果,測試當前已取得的中值是噪聲點,則擴大窗口的尺寸,在更大的空間中重新尋找中值。
上面自適應(yīng)中值濾波器實現(xiàn)起來比較簡單,所以問題就來了:效率及其的低下。這里,這是對自適應(yīng)中值濾波器的原理的學(xué)習(xí),可以忽略這個不必要的細節(jié)。
結(jié)果對比
左邊是添加概率為0.2的椒鹽噪聲,右邊是原圖。下面是使用常規(guī)的中值濾波和本文實現(xiàn)的自適應(yīng)中值濾波器后的處理結(jié)果
左邊是自適應(yīng)中值濾波器(最小窗口為3,最大窗口為7)的結(jié)果,右圖是常規(guī)中值濾波器(窗口大小為5)的結(jié)果??梢钥闯觯瑹o論是中值濾波還是自適應(yīng)的中值濾波,都能過濾掉圖像中的噪聲,自適應(yīng)中值濾波器的效果要好些,常規(guī)的還有一些噪聲沒有過濾掉。而且,常規(guī)的中值濾波器對圖像造成的模糊較明顯,而自適應(yīng)中值濾波器很好的的保存了圖像中的細節(jié)。
下面測試更大概率噪聲下,兩種濾波器的工作情況。噪聲概率為0.4時,
可以看出,常規(guī)的中值濾波器已經(jīng)不能很好的過濾掉噪聲,而自適應(yīng)的中值濾波還可以勝任。
中值濾波器總結(jié)
· 中值濾波器能夠很好的濾除“椒鹽”噪聲。椒鹽噪聲是在圖像上隨機出現(xiàn)的孤立點,根據(jù)中值濾波器的原理,使用鄰域像素的中值代替原像素,能夠有效的消除這些孤立的噪聲點。
· 和均值濾波器相比,中值濾波在消除噪聲的同時,還能在很大程度保護圖像的細節(jié),不會造成很大的模糊。
· 和常規(guī)的中值濾波器相比,自適應(yīng)中值濾波器能夠更好的保護圖像中的邊緣細節(jié)部分。
文章轉(zhuǎn)自Brook_icv https://www.cnblogs.com/wangguchangqing/p/6379646.html