灰度最小方差的均值滤波器原理及matlab代码实现

时间:2024-03-23 16:18:52

灰度最小方差的均值滤波器

本方法的核心思想是,设置一个模板,如果模板中的像素属于同一个区域,则模板中不包含边界像素,可以进行平滑处理;如果模板中的像素属于至少两个不同的区域,则模板中包含有边界像素,这是要对其进行保持,不进行平滑处理。

要判断模板中的像素是否属于同一区域,一个最常用的方法是计算模板中所有像素的灰度方差,如果方差大,则表明模板像素属于不同区域的可能性大。考虑到景物边界的不规则性,选9个不同形状的模板。对9个模板所覆盖区域中的像素,分别计算其灰度分布方差,然后选择出方差为最小的模板中的像素灰度均值代替原像素值。下图2-1是9个形状不同的平滑处理模板。

灰度最小方差的均值滤波器原理及matlab代码实现

                                                                2-1  9种不同形状的平滑处理模板

 “o  ”包围的像素是当前的待处理像素。灰度最小方差的均值滤波算法流程如下:

1)以“ o”包围的f(x,y)像素为中心,计算图2-1所示的9个模板中的所有像素的灰度分布方差;

2)找出方差值为最小的模板位置;

3)将所选择出的模板中的像素的灰度平均值替代f(x,y);

4)对图像中所有处于滤波范围内的像素点均进行相同的处理。

 

简单矩阵实例:


clc
close all
%% 灰度最小方差的均值滤波器
%朱虹-数字图像处理基础,第94页实例
f=[1 3 2 3 2 1 2;1 2 1 4 3 3 2;1 10 2 3 4 4 2;5 2 6 18 8 7 3;5 5 7 0 8 8 5;5 6 7 8 9 9 8;4 5 6 8 8 6 7];
[row, col]=size(f);
k=f;
for r=3:row-2
    for c=3:col-2
        n1=[k(r-2,c-1),k(r-2,c),k(r-2,c+1),k(r-1,c-1),k(r-1,c),k(r-1,c+1),k(r,c)];
        n2=[k(r-1,c+1),k(r-1,c+2),k(r,c),k(r,c+1),k(r,c+2),k(r+1,c+1),k(r+1,c+2)];
        n3=[k(r,c),k(r+1,c-1),k(r+1,c),k(r+1,c+1),k(r+2,c-1),k(r+2,c),k(r+2,c+1)];
        n4=[k(r-1,c-2),k(r-1,c-1),k(r,c-2),k(r,c-1),k(r,c),k(r+1,c-2),k(r+1,c-1)];
        n5=[k(r-2,c-2),k(r-2,c-1),k(r-1,c-2),k(r-1,c-1),k(r-1,c),k(r,c-1),k(r,c)];
        n6=[k(r,c-1),k(r,c),k(r+1,c-2),k(r+1,c-1),k(r+1,c),k(r+2,c-2),k(r+2,c-1)];
        n7=[k(r,c),k(r,c+1),k(r+1,c),k(r+1,c+1),k(r+1,c+2),k(r+2,c+1),k(r+2,c+2)];
        n8=[k(r-2,c+1),k(r-2,c+2),k(r-1,c),k(r-1,c+1),k(r-1,c+2),k(r,c),k(r,c+1)];
        n9=[k(r-1,c-1),k(r-1,c),k(r-1,c+1),k(r,c-1),k(r,c),k(r,c+1),k(r+1,c-1),k(r+1,c),k(r+1,c+1)];
        nn=[round(mean(n1)),round(mean(n2)),round(mean(n3)),round(mean(n4)),round(mean(n5)),round(mean(n6)),round(mean(n7)),round(mean(n8)),round(mean(n9))];
        m=[var_n(n1) var_n(n2) var_n(n3) var_n(n4) var_n(n5) var_n(n6) var_n(n7) var_n(n8) var_n(n9)];
        %对9个方差进行冒泡排序法        
      for i=1:8
       for j=1:9-i
          if m(j)>m(j+1)
               t1=m(j+1);
              m(j+1)=m(j);
              m(j)=t1;
              t=nn(j+1);
              nn(j+1)=nn(j);
              nn(j)=t;
          end
       end
      end
       f(r,c)=nn(1,1);      
    end
end
f