所谓的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列的灰度直方图hisvar=zeros(256,1);%记录每一灰度值的点的个数for i=1:m for j=1:n gray=GIM(i,j)+1; his(gray,1)=his(gray,1)+1; endend 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);endyu_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 endendimshow(GIM);end