clear
clc;
%% 选择图片,并二值化
[fn,pn,fi]=uigetfile('*.jpg','选择图片');
I=imread([pn fn]);
if ndims(I) == 3
I = rgb2gray(I);
end
% fxy = imhist(I, 256); %统计每个灰度值的个数
[counts,x] = imhist(I, 256) ;
figure;
subplot(2, 2, 1);
imshow(I, []); title('原图')
%% 使用最大类间方差法得到阈值
countsx=counts.*x;
sumI=sum(counts);
baifen=counts/sumI;
w0=zeros(1,length(x)); %A比B多一个元素,为1行,length(B)+1列的全0向量
u0=zeros(1,length(x));
u1=zeros(1,length(x));
w0(1)=baifen(1);
for i=2:length(x)
w0(i)=w0(i-1)+baifen(i); % A[k+1]=B[k]
end
for i=1:length(x)-1
u0(i)=sum(counts(1:i).*x(1:i))/sum(counts(1:i));
u1(i)=sum(counts(i+1:length(x)).*x(i+1:length(x)))/sum(counts(i+1:length(x)));
end
w1=1-w0;
all=w0.*w1.*(u0-u1).*(u0-u1);
[C2,p]=max(all);
p
p=p/255;
%% 使用阈值法进行图片分割
image = im2bw(I, p); %小于阈值的为黑,大于阈值的为白
subplot(2, 2, 2);
imshow(image);
title('(b)图像前景与背景区分明显的分割结果')
效果:
参考文献:
[1] 齐丽娜, 张博, 王战凯. 最大类间方差法在图像处理中的应用[J]. 无线电工程, 2006, 36(7):25-26.