import cv2 as cv
import numpy as np
import math
# 最大熵分割
def max_entropy(img):
# 概率数组
p = np.zeros(256, np.float32)
rows, cols = img.shape
# 统计各个灰度级的次数
for i in range(rows):
for j in range(cols):
p[img[i, j]] += 1
# 统计各个灰度级的次数还可以使用另外一个函数
p = cv.calcHist([img], [0], None, 256, [0, 256])
# 计算各个灰度级的概率
for i in range(256):
p[i] /= rows * cols
# 对每一个灰度级分别进行计算熵
ps = 0.0
ho, hb = 0.0, 0.0
num = np.zeros(256, np.float32)
for i in range(256):
for j in range(i+1):
ps += p[j]
for j in range(i+1):
if p[j]/ps <= 0:
continue
ho += (p[j]/ps)*math.log(p[j]/ps, 10)
for j in range(i+1, 256):
if p[j]/(1-ps) <= 0:
continue
hb += (p[j]/(1-ps))*math.log(p[j]/(1-ps), 10)
ho = -ho
hb = -hb
num[i] = ho + hb
# 找出熵最大的灰度级
max_e = 0.0
th = 0
for i in range(256):
if num[i] > max_e:
max_e = num[i]
th = i
return th