欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

自动选择阈值--最大类间方差法(OTSU)原理及matlab实现

程序员文章站 2024-03-16 10:18:58
...

原理

基本思想:
把一幅图像分成两部分C0,C1.使前景和背景与平均灰度的差别最大。这种差异用方差sigmaB表示。
所以目标就是求最大方差sigmaB对应的阈值T。
自动选择阈值--最大类间方差法(OTSU)原理及matlab实现

matlab代码

clc
clear  
x=imread('rice.png');   
   a=x;
   subplot(211);  
   imshow(a,[]);  
   %[count x]=imhist(a);   
   [m,n]=size(a);   
   N=m*n;   
   L=256;   

for i=1:L  
    count(i)=length(find(a==(i-1)));  
    f(i)=count(i)/(N);  %每个灰度对应的概率,i=1,对应灰度值为0(i-1)
end  

for i=1:L   
    if count(i)~=0   
        st=i-1;   %开始的灰度值
        break;   
    end   
end   
for i=L:-1:1   
    if count(i)~=0   
        nd=i-1;   %结束的灰度值
        break;   
    end   
end   

p=st;   q=nd-st+1;   
u=0;   
for i=1:q   
    u=u+f(p+i)*(p+i-1);  %u是像素的平均值    
    ua(i)=u;           %ua(i)是前i+p个像素的平均灰度值  (前p个无取值) 
end;   

for i=1:q   
    w(i)=sum(f(1+p:i+p));  %w(i)是前i个像素的累加概率,对应公式中P0 
end;   

w=w+eps;  
   %对照sigmaB的公式写出目标函数。实际是遍历所有值
d=(w./(1-w)).*(ua./w-u).^2;
[y,tp]=max(d);  %可以取出数组的最大值及取最大值的点   
th=tp+p;  


subplot(212);  
imshow(im2bw(a,th/255),[]);  title('自己的最大类间方差');

subplot(211);  
imshow(im2bw(x,graythresh(x)),[]);  title('matlab自带');

效果

自动选择阈值--最大类间方差法(OTSU)原理及matlab实现
可以看到自己编写的与matlab自带效果相同。