二维最大类间方差(otsu)matlab实现源码

今天整理电脑资料,没想到翻到以前上学时候写的小论文,电脑里居然还存着以前用matlab写得最大类间方差的二维实现源码。当时持续写了好几个星期才搞定,忘了哪个是最终版本了,只好按照日期把最后的那个源码版本贴出来,不知道里面有没有bug。


%%传统二维Otsu方法
function [idx idy]=otsuHistgram2(I)
%I=imread('rice.png');
noise=imnoise(I,'gaussian',0,0.03);
I=noise;
figure,imhist(I);
figure,imshow(I);
%% 求出图像的邻域和中值
h=fspecial('average',[3 3]);
[m,n]=size(I);
totalnum=m*n;
flt=filter2(h,I);%邻域均值
flt=uint8(flt);
I=uint8(I);
%duality 二元性(灰度,邻域)
%% 求(灰度,邻域)出现的频率
num_bins = 256;
f(1:num_bins,1:num_bins)=0;
for r=1:m
    for l=1:n
        gry=I(r,l);  %灰度gray
        adj=flt(r,l);%邻域adjacent
        f(gry+1,adj+1)=f(gry+1,adj+1)+1;
    end
end
Pij=f./totalnum;
%% 画出二维直方图
[X,Y] = meshgrid(1:num_bins);
Z=f; 
plot3(X,Y,Z);
figure;
mesh(X,Y,Z);
colormap(cool); 
%% 二维直方图上总的均值矢量Ut=(uti,utj)'
r=1:num_bins;
muti=sum((r-1)*Pij(r,:));
mutj=sum((r-1)*Pij(:,r)');
%% 两类出现的概率 W0,W1=1-W0
 w0=cumsum(Pij);
 w0=cumsum(w0,2); 
 w0=w0+(w0==0)*eps; 
%% 两类对应的均值矢量 Ui,Uj
%%将[0:255]分别乘

你可能感兴趣的:(matlab)