用otsu算法进行图像阈值化

来源:互联网 发布:asp获取远程json数据 编辑:程序博客网 时间:2024/05/18 12:41

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

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

    类间方差的算法为:

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

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

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

    用python写的otsu算法:

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

    

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 numGraydef 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

原创粉丝点击