本方法的核心思想是,设置一个模板,如果模板中的像素属于同一个区域,则模板中不包含边界像素,可以进行平滑处理;如果模板中的像素属于至少两个不同的区域,则模板中包含有边界像素,这是要对其进行保持,不进行平滑处理。
要判断模板中的像素是否属于同一区域,一个最常用的方法是计算模板中所有像素的灰度方差,如果方差大,则表明模板像素属于不同区域的可能性大。考虑到景物边界的不规则性,选9个不同形状的模板。对9个模板所覆盖区域中的像素,分别计算其灰度分布方差,然后选择出方差为最小的模板中的像素灰度均值代替原像素值。下图2-1是9个形状不同的平滑处理模板。
图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-2for c=3:col-2n1=[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:8for j=1:9-iif 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;endendendf(r,c)=nn(1,1); end
end
f