Entropy Method图像分割方法代码复现--python
Entropy Method简介
计算前景和背景的信息熵,求最大熵。含义是经过阈值分割后图像的平均信息量越大愈好。
主要就是这两个公式,熵的计算公式,学过信息论或通信原理的应该都了解,衡量平均信息量。
代码
# -*- 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)
分析