中值滤波
利用中值滤波的方法对图像进行平滑处理,函数如下
fig_med = medfilt2(fig,[m,n]) % 对矩阵[m,n]进行中值滤波
类间方差阈值算法
利用类间方差阈值算法对滤波处理后图像进行分割处理,获取分割图像;
子函数如下所示:
function[threshold]=Ostu(fig)
s=256^2;
N=zeros(256,1); %-----------各个灰度值出现次数
T=zeros(256,1);
for k=0:255 %-----------各个灰度值出现次数计数
num=size(find(fig==k),1);
N(k+1,1)=num;
end
for t=1:256
w0=0; w1=0; u0=0; u1=0;
for m=1:t
w0=w0+N(m,1)/s;
u0=u0+(m-1)*N(m,1)/s;
end
for m =t:256
w1=w1+N(m,1)/s;
u1=u1+(m-1)*N(m,1)/s;
end
u0=u0/w0;
u1=u1/w1;
T(t,1)=w0*w1*(u1-u0)^2;
end
threshold=find(T==max(max(T)))-1;
end
图像分割
m=3;
n=3;
fig = imread('dock.png');
fig = rgb2gray(fig);
subplot(1,3,1);
imshow(fig);
title('原图');
fig_med = medfilt2(fig,[m,n]); %-------------中值滤波器
threshold=Ostu(fig_med);
fig_segment=fig_med;
fig_segment(fig_segment<threshold)=0;
fig_segment(fig_segment>=threshold)=255;
subplot(1,3,2);
imshow(fig_med);
title('中值滤波');
subplot(1,3,3);
imshow(fig_segment);
title('图像分割');
展示效果
笔者做了一个GUI界面,可以输入任意m,n值来改变中值滤波的效果。
原图:
效果如下: