otus算法

所谓的otus算法实际上就是寻找一个阈值,用来对整幅图的灰度进行分界,如果灰度大于这个阈值的就显示为白色,小于阈值的就显示为黑色。

而这个阈值该如何寻找就是otus算法的核心。

otus算法采用的是寻找最大类间分类法。

初听这个名字觉得很高大上,实际上就是把图像的灰度直方图找出来,然后用这个阈值进行分界,找到界限两边各自方差,然后将这两个方差求差的绝对值,绝对值最大的时候那个分界灰度就是阈值灰度,matlab代码如下:

function [ output_args ] = otus( IM )
%OTUS Summary of this function goes here
%   Detailed explanation goes here
[m,n,h]=size(IM);
GIM=rgb2gray(IM);%GIM为灰度图像
his=zeros(256,1);%定义一个256行1列的灰度直方图his
var=zeros(256,1);

%记录每一灰度值的点的个数
for i=1:m
    for j=1:n
        gray=GIM(i,j)+1;
        his(gray,1)=his(gray,1)+1;
    end
end

    
    
for yu=1:255
    left=0;%左边平均数
    left_num=0;%左边总数
    left_var=0;%左边方差
    
    right=0;%右边平均数
    right_num=0;%右边总数
    right_var=0;%右边方差
    
    for i=1:yu
        left=his(i,1)*i+left;
        left_num=left_num+his(i,1);
    end
     if left_num==0
            left=0;
        else
    left=left/left_num;
     end
    
    for j=yu+1:255
        right=his(j,1)*j+right;
        right_num=right_num+his(j,1);
    end
     if right_num==0
            right=0;
        else
    right=right/right_num;
     end
    
    %计算左右两边方差
    for i=1:yu
        if left_num==0
            left_var=0;
        else
        left_var=((i-left)*his(i,1)/left_num).^2+left_var;
        end
    end
    
    for j=yu+1:255
        if right_num==0
            right_var=0;
        else
        right_var=((j-right)*his(j,1)/right_num).^2+right_var;
        end
    end
    
    var(yu,1)=abs(right_var-left_var);
end

yu_max=find(var==max(max(var)));

for i=1:m
    for j=1:n
        if GIM(i,j)+1>yu_max
        GIM(i,j)=255;
        else
            GIM(i,j)=0;
        end
    end
end

imshow(GIM);

end

 

posted @ 2015-04-17 17:29  PHPer_Wu  阅读(1871)  评论(0编辑  收藏  举报