用otsu算法进行图像阈值化

    在对一幅灰度图像进行阈值化操作时,首先需要确定阈值,确定阈值的方法有很多种,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 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

你可能感兴趣的:(用otsu算法进行图像阈值化)