您的位置:首页 > 编程语言 > MATLAB

最大类间方差寻找最佳阈值实现图像的分割——MATLAB

2019-08-20 15:42 1876 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/qq_33668060/article/details/99844850

                                        最大类间方差寻找最佳阈值实现图像的分割

顾名思义,该方法是使用最大类间方差实现图像分割中最佳阈值的寻找。

 

为什么最大类间方差能实现分割阈值的寻找?

答:从统计学的意义上讲,方差是表征数据分布不均衡的统计量,方差越大,说明数据间的差别越明显。假设现在有一组数据A,找一个合适中间值K,将A分成A1A2两组,如果A1和A2两者之间的方差越大,这说明两组数据之间的区分越明显。我们在进行图像分割时,就是期望能找到一个这样的阈值K,使图像中的目标和背景分割开来,使背景和目标比较明显。

 

实现步骤:

  1. 求取输入图像I直方图H以及整体灰度平均值U。根据直方图,求取每个灰度级所占的概率P(i)
  2. 设定K值,一般采用for循环(K=0:255),根据K值将图像分成两部分A和B,分别求取A的期望和B的期望,以及A和B概率P(A)、P(B)
  3. 最后,通过公式 求取每个阈值K(0~255)下的方差,取其中的最大的 所对应的K为整体的最佳阈值

MATLAB实现过程:

         采用MATLAB中自带的rice.png作为原始图像。

[code]close all; clear all; clc
I = imread('rice.png');
figure;imshow(I);
[m,n] = size(I);
H = imhist(I);  %I的直方图结果
figure;imhist(I)

%求出每个灰度下的概率
for a=1:size(H,1)
P(a,1) = H(a,1)/(m*n);
end

% 总体平均值
u = sum(sum(I))/(m*n);

%  循环K值,并将每个K值分割后的图像分别保存在Pa和Pb两个矩阵中,
%  将每种概率下对应的灰度值保存在Ua和Ub中。
for k=0:255
i = 1;
j = 1;
for b=1:size(H,1) %  b代表灰度级
if b<=k   %判断灰度小于等于阈值的情况,将其概率和灰度分别保存在Pa和Ua中
Pa(k+1,i) = P(b,1);
Ua(k+1,i) = b*H(b,1);
i = i+1;
else   %判断灰度大于阈值的情况,将其概率和灰度分别保存在Pb和Ub中
Pb(k+1,j) = P(b,1);
Ub(k+1,j) = b*H(b,1);
j = j+1;
end
end
end
aa=sum(Pa,2); %分割图像A中的概率,每一行代表一种K值得情况
bb=sum(Pb,2); %分割图像B中的概率,每一行代表一种K值得情况
UA = sum(Ua,2)/(size(Ua,1)*size(Ua,2)); %计算A的整体均值
UB = sum(Ub,2)/(size(Ub,1)*size(Ub,2)); %计算B的整体均值

sigma = aa.*(UA-u).^2 + bb.*(UB-u).^2; %计算总方差
t = max(sigma);  %求取所有方差中的最大值

%计算最大值方差所对应的K中
for x=1:256
if sigma(x) == max(sigma)
k = x;
end
end

%根据所求得的阈值k,将图像分割成二值图像
for i=1:m
for j=1:n
if I(i,j) < k
J(i,j) = 0;
else
J(i,j) = 1;
end
end
end
figure;imshow(J,[])

处理结果

原图:

处理后的图像:

 

总结,从处理结果上来看该结果效果不好,该阈值不是最佳阈值。具体原因我也没找出来,以后找出来了再进行补充吧。

在MATLAB中im2bw()函数就是采用这种方法进行处理的,但im2bw()函数的处理结果比上面的结果好。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: