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

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

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

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

答:从统计学的意义上讲,方差是表征数据分布不均衡的统计量,方差越大,说明数据间的差别越明显。假设现在有一组数据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. 最后,通过公式\sigma_{k}^{2}=P(A)*(u_A-U)^{2} + P(B)*(u_B-U)^{2}求取每个阈值K(0~255)下的方差,取其中的最大的\sigma _{k}^{2}所对应的K为整体的最佳阈值

MATLAB实现过程:

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

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()函数的处理结果比上面的结果好。

发布了15 篇原创文章 · 获赞 5 · 访问量 4392

猜你喜欢

转载自blog.csdn.net/qq_33668060/article/details/99844850
今日推荐