最近在做双阈值的对比实验需要用到Otsu,发现网上没有python的实现,所以写下来记录一下。
Otsu双阈值算法的思想与单阈值的思想类似,单阈值的思想为:
g = w0(u0-u)^2+w1(u1-u)^2
使得g最大。
Otsu双阈值的思想则为:
g = w0(u0-u)^2+w1(u1-u)^2+w2(u2-u)^2
使得g最大。
u0为背景区域的平均值,u1为中间区域的平均值,u2为前景区域的平均值。
w0为背景区域的概率,w1为中间区域的概率,w2为前景区域的概率。
所以用python做简单的实现:
def Otsu2Threshold(src):
Threshold1 = 0
Threshold2 = 0
weight, height = np.shape(src)
hest = np.zeros([256], dtype=np.int32)
for row in range(weight):
for col in range(height):
pv = src[row, col]
hest[pv] += 1
tempg = -1
N_blackground = 0
N_object = 0
N_all = weight * height
for i in range(256):
N_object += hest[i]
for k in range(i, 256, 1):
N_blackground += he