当前位置:编程学习 > 网站相关 >>

用otsu算法进行图像阈值化

  在对一幅灰度图像进行阈值化操作时,首先需要确定阈值,确定阈值的方法有很多种,otsu算法是其中比较好的一种算法。

    otsu算法又称作最大类间差算法。阈值化操作所设的阈值将图像中的所有像素点区分为两个类别:前景和背景。otsu假设最优的阈值是能使这两类之间的类间方法最大的一个值。

    类间方差的算法为:

    M=w1*w2*[u1-u2]^2

    其中w1和w2分别是两个类别的比重,即像素个数。u1和u2分别是两个类别的均值。

    算法详细说明见维基百科:维基百科:otsu算法

    用python写的otsu算法:

    getGray函数获取灰度图像的直方图表示,灰度图像img为单通道的。

   

[python]
def getGray(img): 
    numGray=[0 for i in range(pow(2,img.depth))] 
    for h in range(img.height): 
    for w in range(img.width): 
        numGray[int(img[h,w])]+=1 
    return numGray 
 
def getThres(gray): 
    maxV=0 
    bestTh=0 
    w=[0 for i in range(len(gray))] 
    px=[0 for i in range(len(gray))] 
    w[0]=gray[0] 
    px[0]=0 
    for m in range(1,len(gray)): 
            w[m]=w[m-1]+gray[m] 
            px[m]=px[m-1]+gray[m]*m 
    for th in range(len(gray)): 
            w1=w[th] 
            w2=w[len(gray)-1]-w1 
            if(w1*w2==0): 
                    continue 
            u1=px[th]/w1 
            u2=(px[len(gray)-1]-px[th])/w2 
            v=w1*w2*(u1-u2)*(u1-u2) 
            if v>maxV: 
                    maxV=v 
                    bestTh=th 
    return bestTh 

补充:Web开发 , Python ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,