@
1.OTSU算法原理簡述:
最大類間方差是由日本學者大津(Nobuyuki Otsu)於1979年提出,是一種自適應的閾值確定方法。算法假設圖像像素能夠根據閾值,被分成背景[background]和目標[objects]兩部分。然后,計算該最佳閾值來區分這兩類像素,使得兩類像素區分度最大。
公式: 記 M = 256 單通道灰度分級 Sum = 像素總數
2.MATLAB實現代碼
clc
clear
x=imread('radiogirl.jpg');
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自帶效果相同。