Entropy Method图像分割方法代码复现--python

Entropy Method简介

 

Entropy Method图像分割方法代码复现--python

计算前景和背景的信息熵,求最大熵。含义是经过阈值分割后图像的平均信息量越大愈好。

主要就是这两个公式,熵的计算公式,学过信息论或通信原理的应该都了解,衡量平均信息量。

代码

# -*- coding: utf-8 -*-
"""
Created on Thu Apr 25 08:48:19 2019
Entropy Method
@author: yun
"""

import cv2
import numpy as np
import matplotlib.pyplot as plt
import math

def Entropy(gray):
    p = []#灰度概率
    
    H_last = 0#上一个H总熵
    best_k =0#最佳阈值
    hist = cv2.calcHist([gray],[0],None,[256],[0,256])#255*1的灰度直方图的数组
    for i in range(256):
        p.insert(i,hist[i][0]/gray.size)
    for k in range(256):
        H_b = 0#black的熵,前景的平均信息量
        H_w = 0#white的熵,背景的平均信息量
        for i in range(k):
            if p[i] != 0:
                H_b = H_b - p[i]*math.log(2,p[i])
        
        for i in range(k,256):
            if p[i] != 0:
                H_w = H_w - p[i]*math.log(2,p[i])
           
        H = H_b + H_w
        if H>H_last:
            H_last = H
            best_k = k
      
    return H,best_k


if __name__ == "__main__":
    img = cv2.imread('leina.jpg')#读取图像(BGR)
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #转灰度图像
    H,best_k = Entropy(gray)
    print(H,best_k)
    ret,thresh1=cv2.threshold(gray,best_k,255,cv2.THRESH_BINARY)
    cv2.imshow("histogram", thresh1)

分析

Entropy Method图像分割方法代码复现--python    Entropy Method图像分割方法代码复现--python

Entropy Method图像分割方法代码复现--python      Entropy Method图像分割方法代码复现--python

 

这两幅图的分割效果一般。这个方法和之前的大津阈值法类似,都是为了寻找最佳阈值,分割前景和背景。但都受到灰度直方图双峰性的约束(灰度图见上一篇博客),分割效果可以和前一篇比较。