自动选择阈值--最大类间方差法(OTSU)原理及matlab实现
程序员文章站
2024-03-16 10:18:58
...
原理
基本思想:
把一幅图像分成两部分C0,C1.使前景和背景与平均灰度的差别最大。这种差异用方差sigmaB表示。
所以目标就是求最大方差sigmaB对应的阈值T。
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自带');
效果
可以看到自己编写的与matlab自带效果相同。
上一篇: Java 类与对象