基于局部均方差的圖像去噪聲算法
1.基于局部均方差去噪原理
假設一幅M*N的灰階圖像的灰階圖像,x(i,j)為模闆中心的灰階值,那麼在(2*n+1)(2*m+1)的視窗内,其局部均值可以表示為:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsISM4ITMyIjM3EzMxgDM3EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
其局部均方差可以表示為:
加性去噪後的結果為:
其中K為:
關于K計算的公式中,
為使用者輸入的參數。根據我之前的部落格《圖像比較之模闆比對》中,提到的方差和均值的關系,我們可以推導出,方差可以表示為:
我們知道,方差在統計學中表示的是與中心偏離的程度,用來衡量資料的波動性大小。對于圖像而言,當上述局部方差比較小,意味着圖像中該局部區域屬于灰階平坦區,各個像素灰階值相差不大;相反,當上述局部方差比較大的時候,意味着圖像中該局部區域屬于邊緣或者是其他高頻部分區域,各個像素的灰階值相差比較大。
當局部屬于平坦區時,方差很小,趨近于0。該點濾波之後的像素就是該點的局部平均值。由于該局部各點像素的灰階值相差不大,其局部平均值也與各個像素的灰階值相差不大;當局部屬于邊緣區域時,方差較大,相對于使用者輸入的參數可以基本忽略不計,其圖像去噪之後,就等于輸入的圖像灰階值。可以說,這種方法在一定程度上對邊緣具有保留,能夠保留邊緣的同時,進行去噪。
類似邊緣保留的去噪算法,諸如雙邊濾波等。都是對圖像中的平坦區域和邊緣區域進行相應的數學描述,再基于該數學描述所對應的圖像區域,對不同區域賦予不同的權重,邊緣區域權重适當較小;平坦區域權重适當增大;做不同程度的去噪。
2.代碼實作
8Bit BMP圖像資料格式的關鍵代碼片段:
for (x = SIZE/2;x < height-SIZE/2;x++)
{
for (y = SIZE/2;y < width-SIZE/2;y++)
{
Sum = 0;
Mean = 0;
Sum2 = 0;
index = x*lineByte+y;
for(i = -SIZE/2;i<= SIZE/2;i++)
{
for(j = -SIZE/2;j<=SIZE/2;j++)
{
tmp = img_data[index+i*lineByte+j];
Sum += tmp;
Sum2 += img_data[index+i*lineByte+j]*img_data[index+i*lineByte+j];
}
}
Mean = Sum/size;
Var = (Sum2-(Sum*Sum)/size)/size;
k = Var/(Var+Sigmma);
img_data[index] = CLIP255((int)((1-k)*Mean+k*img_data[index]));
}
}
24Bit BMP圖像資料格式的關鍵代碼片段:
for(i = SIZE/2;i < height-SIZE/2;i++)
{
for(j = SIZE/2;j < width-SIZE/2;j++)
{
index = i*lineByte+3*j;
SumR2 = 0;
SumG2 = 0;
SumB2 = 0;
SumR = 0;
SumG = 0;
SumB = 0;
MeanR = 0;
VarR = 0;
MeanG = 0;
VarG = 0;
MeanB = 0;
VarB = 0;
for(m = -SIZE/2;m<= SIZE/2;m++)
{
for(n = -SIZE/2;n<=SIZE/2;n++)
{
SumB += img_data[index+m*lineByte+n*3];
SumB2 += img_data[index+m*lineByte+n*3]*img_data[index+m*lineByte+n*3];
SumG += img_data[index+1+m*lineByte+n*3];
SumG2 += img_data[index+1+m*lineByte+n*3]*img_data[index+1+m*lineByte+n*3];
SumR += img_data[index+2+m*lineByte+n*3];
SumR2 += img_data[index+2+m*lineByte+n*3]*img_data[index+2+m*lineByte+n*3];
}
}
//計算平均值
MeanR = SumR/size;
MeanG = SumG/size;
MeanB = SumB/size;
//計算方差
VarR = (SumR2-(SumR*SumR)/size)/size;
VarG = (SumG2-(SumG*SumG)/size)/size;
VarB = (SumB2-(SumB*SumB)/size)/size;
//計算系數
kr = VarR /(VarR+Sigmma);
kg = VarG /(VarG+Sigmma);
kb = VarB /(VarB+Sigmma);
img_data[index+2] = CLIP255((int)((1-kr)*MeanR+kr*img_data[index+2]));
img_data[index+1] = CLIP255((int)((1-kg)*MeanG+kg*img_data[index+1]));
img_data[index] = CLIP255((int)((1-kb)*MeanB+kb*img_data[index]));
}
}
2.圖像濾波效果
左側為原始圖像,右側為濾波之後的圖像。SIZE=9,Sigmma = 350。
左側為原始圖像,右側為濾波之後的圖像。SIZE=5,Sigmma = 250。
參考資料:
https://juejin.im/post/58fd4b1bda2f60005dc79015
http://www.cnblogs.com/Imageshop/p/4679065.html