天天看點

基于局部均方差的圖像去噪聲算法基于局部均方差的圖像去噪聲算法

基于局部均方差的圖像去噪聲算法

1.基于局部均方差去噪原理

     假設一幅M*N的灰階圖像的灰階圖像,x(i,j)為模闆中心的灰階值,那麼在(2*n+1)(2*m+1)的視窗内,其局部均值可以表示為:

基于局部均方差的圖像去噪聲算法基于局部均方差的圖像去噪聲算法

    其局部均方差可以表示為:

基于局部均方差的圖像去噪聲算法基于局部均方差的圖像去噪聲算法

      加性去噪後的結果為:

基于局部均方差的圖像去噪聲算法基于局部均方差的圖像去噪聲算法

      其中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