opencv库(5)

图像的分割之基于熵的分割

一维最大熵分割

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

Guess you like

Origin blog.csdn.net/weixin_49346755/article/details/121170836