zoukankan      html  css  js  c++  java
  • MATLAB实现OTSU

    @

    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自带效果相同。

  • 相关阅读:
    HDU 2104 hide handkerchief
    HDU 1062 Text Reverse 字符串反转
    HDU 1049
    HDU 1096 A+B for Input-Output Practice (VIII)
    POJ 1017
    C/C++一些难为人知的小细节
    小刘同学的第十二篇博文
    小刘同学的第十一篇博文
    小刘同学的第十篇博文
    小刘同学的第九篇日记
  • 原文地址:https://www.cnblogs.com/xiegaosen/p/12004772.html
Copyright © 2011-2022 走看看