用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 ,